Как работает диспетчеризацию событий - Java

Узнай цену своей работы

Формулировка задачи:

Объясните пожалуйста, как работает диспетчеризация событий. Для опыта написал вот что:
Листинг программы
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. class Test
  5. {
  6. String txt = "";
  7. Test ()
  8. {
  9. JFrame wnd = new JFrame("Тестовая прога");
  10. wnd.setBounds(200, 100, 300, 200);
  11. wnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12. wnd.setLayout(new FlowLayout());
  13. JButton btn1 = new JButton("Click #1");
  14. JButton btn2 = new JButton("Click #2");
  15. JButton btn3 = new JButton("Click #3");
  16. wnd.add(btn1);
  17. wnd.add(btn2);
  18. wnd.add(btn3);
  19. JLabel lab = new JLabel(txt);
  20. wnd.add(lab);
  21. btn1.addActionListener(new ActionListener ()
  22. {
  23. public void actionPerformed (ActionEvent ae)
  24. {
  25. txt += "1,";
  26. lab.setText(txt);
  27. try
  28. {
  29. Thread.sleep(1500);
  30. }
  31. catch (InterruptedException ie)
  32. {
  33. }
  34. }
  35. });
  36. btn2.addActionListener(new ActionListener ()
  37. {
  38. public void actionPerformed (ActionEvent ae)
  39. {
  40. txt += "2,";
  41. lab.setText(txt);
  42. try
  43. {
  44. Thread.sleep(1500);
  45. }
  46. catch (InterruptedException ie)
  47. {
  48. }
  49. }
  50. });
  51. btn3.addActionListener(new ActionListener ()
  52. {
  53. public void actionPerformed (ActionEvent ae)
  54. {
  55. txt += "3,";
  56. lab.setText(txt);
  57. try
  58. {
  59. Thread.sleep(1500);
  60. }
  61. catch (InterruptedException ie)
  62. {
  63. }
  64. }
  65. });
  66. wnd.setVisible(true);
  67. }
  68. public static void main (String args []) throws InterruptedException
  69. {/*
  70. SwingUtilities.invokeLater(new Runnable ()
  71. {
  72. public void run ()
  73. {
  74. new Test ();
  75. }
  76. });*/
  77. new Test ();
  78. }
  79. }
Здесь создаются 3 кнопки и метка. При нажатии каждой кнопки обработчик дописывает к метке свой номер и ждет 1,5 сек. Зачем нужен этот invokeLater()? В книге Герберта Шилдта объяснено непонятно. Я быстро нажимаю кнопки в разном порядке и цифры в метке появляются в том же порядке. Очередь вроде работает одинаково что с инвоком, что без него. В чем прикол? Это для меня очень мозголомная тема. О потоках представление имею из его-же книги для начинающих, если что.

Решение задачи: «Как работает диспетчеризацию событий»

textual
Листинг программы
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4.  
  5. class UpdateProgress implements ActionListener
  6.  {
  7.   static final int UP = 1;
  8.   static final int DOWN = -1;
  9.   JProgressBar pb;
  10.   JLabel lab;
  11.   static boolean isRunning = false;
  12.   int step;
  13.  
  14.   UpdateProgress (JProgressBar pb, JLabel lab, int step)
  15.    {
  16.     this.pb = pb;
  17.     this.lab = lab;
  18.     this.step = step;
  19.    }
  20.  
  21.   public void actionPerformed (ActionEvent ae)
  22.    {
  23.     if (UpdateProgress.isRunning)
  24.      return;
  25.    
  26.     class SetValueBar implements Runnable
  27.      {
  28.       JProgressBar pb;
  29.       int newVal;
  30.      
  31.       SetValueBar (JProgressBar pb, int newVal)
  32.        {
  33.         this.pb = pb;
  34.         this.newVal = newVal;
  35.        }
  36.      
  37.       public void run ()
  38.        {
  39.         pb.setValue(newVal);
  40.        }
  41.      }
  42.    
  43.     lab.setText("Start");
  44. //    UpdateProgress.isRunning = true; // Это исправление а ...
  45.    
  46.     new Thread (new Runnable ()
  47.      {
  48.       public void run ()
  49.        {
  50.         // Это уязвимость.
  51.         // После нажатия второй кнопки в процессе создания потока ...
  52.         // ... возникла "заминка".
  53.         if (step == UpdateProgress.DOWN)
  54.          try
  55.           {
  56.            Thread.sleep(4000);
  57.           }
  58.          catch (InterruptedException ie)
  59.           {
  60.           }
  61.        
  62.         UpdateProgress.isRunning = true; // ... первоначально было здесь. Ошибка!
  63.        
  64.         for (int i = pb.getValue(); step > 0 ? i < 20 : i >= 0; i += step)
  65.          {
  66.           try
  67.            {
  68.             Thread.sleep(500);
  69.            }
  70.           catch (InterruptedException ie)
  71.            {
  72.            }
  73.          
  74.           SwingUtilities.invokeLater(new SetValueBar (pb, i));
  75.          }
  76.        
  77.         lab.setText("Ready !");
  78.         UpdateProgress.isRunning = false;
  79.        }
  80.      }).start();
  81.    }
  82.  }
  83.  
  84. class Test extends JFrame
  85.  {
  86.   JProgressBar pb;
  87.   JLabel lab;
  88.  
  89.   Test ()
  90.    {
  91.     super("Тест");
  92.     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  93.     setBounds(400, 300, 190, 110);
  94.     setLayout(new FlowLayout());
  95.     setResizable(false);
  96.    
  97.     JButton btn1 = new JButton("UP");
  98.     JButton btn2 = new JButton("DOWN");
  99.    
  100.     pb = new JProgressBar(0, 19);
  101.     lab = new JLabel();
  102.    
  103.     btn1.addActionListener(new UpdateProgress (pb, lab, UpdateProgress.UP));
  104.     btn2.addActionListener(new UpdateProgress (pb, lab, UpdateProgress.DOWN));
  105.    
  106.     add(btn1);
  107.     add(btn2);
  108.     add(pb);
  109.     add(lab);
  110.    
  111.     setVisible(true);
  112.    }
  113.  
  114.   public static void main (String args [])
  115.    {
  116.     SwingUtilities.invokeLater(new Runnable ()
  117.                                 {
  118.                                  public void run ()
  119.                                   {
  120.                                    new Test ();
  121.                                   }
  122.                                 });
  123. //    new Test ();
  124.    }
  125.  }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.385 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут