0

Я пытаюсь сделать крошечную программу, которая имеет 3 кнопки, все они белого цвета. Нажатие первой кнопки (с текстом «Go!») Приведет к тому, что вторая кнопка станет оранжевой в течение 3 секунд, а затем, после этого, она снова станет белой, а третья кнопка станет постоянно зеленой.Thread sleep in actionPerformed

Однако в моем следующем коде у меня есть проблема с достижением этого: при нажатии кнопки «Go!» Это заставляет мою программу несколько замораживать в течение 3 секунд, а затем третья кнопка становится зеленой. Не могли бы вы мне помочь?

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Example extends JFrame 
{ 
public Example(String title) 
{ 
    super(title); 
    GridLayout gl = new GridLayout(3,1); 
    setLayout(gl); 

    final JButton b1 = new JButton("Go!"); 
    final JButton b2 = new JButton(); 
    final JButton b3 = new JButton(); 

    b1.setBackground(Color.WHITE); 
    b2.setBackground(Color.WHITE); 
    b3.setBackground(Color.WHITE); 

    b1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      b2.setBackground(Color.ORANGE); 
      try 
      { 
       Thread.sleep(3000); 
      } catch (InterruptedException ie) {} 
      b2.setBackground(Color.WHITE); 
      b3.setBackground(Color.GREEN); 
     } 
    });     

    add(b1); 
    add(b2); 
    add(b3); 

    setSize(50,200); 
    setVisible(true); 
} 

public static void main(String[] args) 
{ 
    Example ex = new Example("My Example"); 
} 
} 
+2

'Thread.sleep' блоки EDT! – Maroun

+0

'Thread.sleep (...)' in actionPerformed: Просто скажите *** NO ***. См. Ответ г-на Д. для решения. –

+1

Советы: 1) Не устанавливайте размер контейнеров верхнего уровня. Вместо этого разместите контент и вызовите 'pack()'. 2) Не выдвигайте раму или другие контейнеры верхнего уровня. Вместо этого создайте & используйте экземпляр одного. –

ответ

2

Свинг однопоточный. Вызов Thread.sleep в EDT предотвращает обновление пользовательского интерфейса. Вместо этого используйте Swing Timer.

+2

Swing Timer - это, безусловно, путь к оригинальной проблеме. 1+ –

+0

Спасибо за ответы! Будет ли SwingTimer или SwingWorker работать? Поскольку я новичок в них, не могли бы вы предоставить какой-то код для моего примера, чтобы я мог его изучить? :) Спасибо – 2013-05-11 14:45:43

+3

@darkchampionz Следите за учебниками, это легко. Попробуйте сами, и если вы не успели опубликовать его здесь, и мы поможем вам! – Maroun

1

Вы звоните Thread.sleep(3000) в основной поток. Следовательно, ваша программа замерзает в течение трех секунд. Как предложил @MarounMaroun, вы должны использовать SwingWorker. Here - это документация.