【问题标题】:Swing timer synchronization摆动定时器同步
【发布时间】:2014-06-02 21:24:00
【问题描述】:

我对 Swing 计时器的工作方式感到困惑。在下面的代码中,我想在按 START(一次)时在第一个文本字段中每 400 毫秒显示 0~9 次。之后,第二个文本字段将显示“已完成”。

public class Main extends JPanel{

private static final long serialVersionUID = 1L;
private JButton bStart;
private JTextField tTest;
private JTextField tNumber;

Main(){
    bStart = new JButton("Start");
    bStart.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            displayNumbers();
        }       
    });

    tTest = new JTextField(null, 30);
    tNumber = new JTextField(" ", 30);
    tNumber.setEditable(false);
    this.setSize(300, 100);
    this.add(bStart);
    this.add(tNumber);
    this.add(tTest);

}

public void displayNumbers(){
    new Timer(400, new ActionListener() {
        int i = 0;
        public void actionPerformed(ActionEvent evt) {
            if(i<10){
                tNumber.setText(Integer.toString(i));
                i++;
            }       
            else
                ((Timer)evt.getSource()).stop();
        }
    }).start(); 

    tTest.setText("Finished");
}

public static void createAndShowGUI(){
    JFrame frame = new JFrame("test");
    frame.add(new Main());
    frame.setSize(400, 150);
    frame.setVisible(true); 
}


public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run() {
            // TODO Auto-generated method stub
            createAndShowGUI();
        }           
    });     
}
}

但是,它在完成显示 0 ~ 9 之前首先显示“Finished”。我认为 Swing 计时器在 EDT 中也可以工作,所以“tTest.setText("Finished");"将在计时器线程之后执行。为什么它不起作用?我如何等待完成显示 0 ~ 9 然后打印“Finished”?谢谢!

感谢您的回答。其实我想问的是一般情况:

new Timer(delay, new ActionListener() {

    public void actionPerformed(ActionEvent evt) {
            doSomething();
    }

}).start(); 

    doOthers();

如何让 doOthers() 在所有 doSomething() 之后执行? (在某些情况下,我们不能将 doOthers() 放在 actionPerformed 函数中,正如一些答案所述)。

【问题讨论】:

    标签: java multithreading swing timer synchronization


    【解决方案1】:

    计时器同时工作。所以计时器启动,然后文本设置为完成,然后计时器触发并出现第一个数字。

    要让计时器在完成后显示完成,请将tTest.setText("Finished"); 放在if(i&lt;10)else 子句中。

    【讨论】:

    • 澄清一下,timer.start() 不会阻止代码的执行,因此会立即调用 setText("Finished")
    • 我打印了 Thread.currentThread().getName() ,发现定时器里面和外面的线程是一样的。这意味着它们在同一个线程中,EDT。为什么它们可以同时运行?
    • Timer.start() 方法只是将一个条目放入队列中。 EDT 执行这些条目。它还会执行您通过SwingUtilities.invokeLater(Runnable) 提交的Runnables。
    • @Sibbo 如何让 doOthers() 在所有 doSomething() 之后执行? (在某些情况下,我们不能将 doOthers() 放入 actionPerformed 函数中,如您所述)。
    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多