线程睡眠在actionPerformed

时间:2013-05-11 14:33:38

标签: java swing actionlistener event-dispatch-thread thread-sleep

我正在尝试制作一个有3个按钮的小程序,所有这些按钮都是白色的。按下第一个按钮(包含文字" Go!")将使第二个按钮变为橙色3秒钟,之后,它将再次变为白色并且第三个按钮将永久变为白色绿色。

但是,在我的下面的代码中,我遇到了一个问题:当按下按钮" 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 个答案:

答案 0 :(得分:2)

Swing是单线程的。在Thread.sleep中调用EDT会阻止UI更新。请改用Swing Timer

答案 1 :(得分:1)

您正在主线程上调用Thread.sleep(3000)。因此,为什么你的程序冻结了三秒钟。正如@MarounMaroun建议的那样,你应该使用SwingWorkerHere是文档。