我想在每个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();
答案 0 :(得分:1)
如果您不希望GUID冻结,则需要在其他线程中执行它。在主线程中运行它会导致GUID冻结。您正在使用秋千,所以要走的路是:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// put your statements and delay here
}
});
答案 1 :(得分:1)
使用Swing Timer
。计时器取代了循环。
每次计时器触发时,您都要设置文本,然后增加“ i”的值。当“ i”达到特定值时,您将停止计时器。
请参见:Jlabel showing both old and new numbers,以获取一个入门的简单示例。
阅读How to Use Swing Timers的Swing教程中的部分,以获得更多信息。