【发布时间】: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