我希望在每个if之间加一个延迟,因为我已经使用Thread.sleep()但是这会冻结gui并且我不知道在循环中使用多个摆动计时器是否可行。
在这里,我正在尝试使用摇摆计时器,并保持冻结gui,我做错了什么?
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
int i=0;
public void actionPerformed(ActionEvent evt) {
try
{
System.out.print(solucion.get(i)+" "+solucion.get(i+1)+" "+solucion.get(i+2)+" \n"+solucion.get(i+3)+" "+solucion.get(i+4)+" "+solucion.get(i+5)+" \n"+solucion.get(i+6)+" "+solucion.get(i+7)+" "+solucion.get(i+8));
System.out.println("\n");
Btn1.setText(solucion.get(i));
Btn2.setText(solucion.get(i+1));
Btn3.setText(solucion.get(i+2));
Btn4.setText(solucion.get(i+3));
Btn5.setText(solucion.get(i+4));
Btn6.setText(solucion.get(i+5));
Btn7.setText(solucion.get(i+6));
Btn8.setText(solucion.get(i+7));
Btn9.setText(solucion.get(i+8));
i++;
}
catch(IndexOutOfBoundsException e){((Timer)evt.getSource()).stop();} //if it gets a error we are at the end of the list and stop the timer
}
};
new Timer(delay, taskPerformer).start();
使用Swing Timer
。 Timer取代了循环。
每次Timer触发时,您都会设置文本然后增加“i”的值。当“i”达到特定值时,您将停止计时器。
请参阅:Jlabel showing both old and new numbers以获取一个简单的示例来帮助您入门。
有关更多信息,请阅读How to Use Swing Timers上Swing教程中的部分。
如果你想让guid不冻结,你需要在另一个线程中执行它。在主线程中运行它将导致guid冻结。你正在使用秋千,所以要走的路是:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// put your statements and delay here
}
});