Swing计时器同步

Sen*_*tal 1 java swing multithreading synchronization timer

我对Swing计时器的工作原理感到困惑.在下面的代码中,我想在按START(一次)时在第一个文本字段中每隔400ms显示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();
        }           
    });     
}
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的回答.事实上,我想要问的是:

new Timer(delay, new ActionListener() {

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

}).start(); 

    doOthers();
Run Code Online (Sandbox Code Playgroud)

如何让doOthers()在所有doSomething()之后执行?(在某些情况下,我们不能把doOthers()放在actionPerformed函数中,正如一些答案所提到的那样).

Sib*_*bbo 6

计时器同时工作.因此启动计时器,然后将文本设置为完成,然后计时器触发并显示第一个数字.

为了让完成后完成计时器显示,就把tTest.setText("Finished");else的条款if(i<10).