0

我有这个代码:

public class Bum extends JFrame implements ActionListener
{
    JButton  button;

    JLabel[] labels;

    public Bum()
    {
        setTitle("Bum!");
        setLayout(null);

        button = new JButton();
        button.setBounds(10, 10, 190, 190);
        button.addActionListener(this);
        add(button);

        labels = new JLabel[10];
        for(int i=0; i<10; i++)
        {
            labels[i] = new JLabel("YES");
            labels[i].setBounds(200, 200 + i * 50, 100, 30);
            add(labels[i]);
        }
    }

    @Override
    public void actionPerformed(ActionEvent arg0)
    {
        for(int i=0; i<10; i++)
        {
            labels[i].setText("NO");
            try 
            {
                Thread.sleep(400);
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) 
    {
        Bum bum = new Bum();
        bum.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        bum.setVisible(true);
        bum.setExtendedState(bum.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    }
}

有一个按钮,它有一个 ActionListener。如果我单击该按钮,那么我想更改所有标签,但一个接一个地更改之间的小中断(我使用 Thread.sleep(400))。这个程序是错误的,因为它同时改变了所有的标签。

4

2 回答 2

1

Swing 是单线程的。通过调用Thread.sleep,您正在阻止 中的更新EDT。请改用摇摆计时器

于 2013-06-13T15:47:22.353 回答
1

通过调用Thread.sleep(),您只是冻结了(event dispatch thread)EDT

改用Swing Timer来安排未来的事件来触发。

从甲骨文网站:

Swing 由三种线程组成:

  • 初始线程,执行初始应用程序代码的线程。

  • 事件调度线程,所有事件处理代码都在其中执行。大多数与 Swing 框架交互的代码也必须在这个线程上执行。

  • 工作线程,也称为后台线程,执行耗时的后台任务。

于 2013-06-13T15:47:41.470 回答