Java事件调度线程被阻止

时间:2015-10-12 12:15:41

标签: java event-dispatch-thread

我正在尝试在程序执行期间更改JLabel的文本。我知道程序执行会阻止EDT,所以我使用计时器来完成这项工作。但是,计时器仅在循环完成后才启动,尽管timer.start()位于源代码循环之前。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.Timer;


@SuppressWarnings("serial")
public class TestUpdate extends JFrame {

JLabel lab;
JButton btn;

public TestUpdate() {
    super("Update test");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    btn = new JButton();
    btn.setText("Start test");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Timer tm = new Timer(1, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    lab.setText("Text is successfully changed");
                    lab.repaint();
                }
            });
            tm.setRepeats(false);
            tm.setInitialDelay(0);
            tm.start();
            long startTime=System.currentTimeMillis();
            while (true) {
                if (System.currentTimeMillis()-startTime >= 3000) break;
                try {Thread.sleep(500);} catch (InterruptedException e1) {}
            }
            lab.setText("Three seconds elapsed");
            btn.setEnabled(false);
        }
    });
    add(btn,"South");

    lab = new JLabel("Should be changed before 3 seconds elapsed");
    lab.setHorizontalAlignment(SwingConstants.CENTER);
    add(lab);

    setSize(300, 200);
    setLocationRelativeTo(null); 
    setVisible(true);

}



public static void main(String[] args) {
    SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {new TestUpdate(); } });
}

}

1 个答案:

答案 0 :(得分:0)

计时器事件由EDT执行,因此当当前任务(带有while循环的动作侦听器代码)将完成时,将执行第一个事件。这就是你观察这种行为的原因。

相关问题