我需要运行for
循环,其中使用计数器变量JLabel
设置i
的文本,然后调用Timer
方法。我现在希望循环等到方法完成。
代码:
public void actionPerformed(ActionEvent arg0) {
for (int i = 1; i < 6; i++) {
labelNr.setText(Integer.toString(i));
startTimer();
}
}
因为它现在所做的是它立即将JLabel
的文本设置为5,因为它贯穿循环,但是在第一个循环中启动计时器。
我希望JLabel
的文本在第一个循环中为1,然后调用Timer方法,然后在第二个循环中调用2,再次调用Timer,在第三个循环中调用3,依此类推。
它基本上只需要等到startTimer()
方法完成执行。我知道synchronized是可能的解决方案,但我不知道如何正确实现它......
提前致谢。
答案 0 :(得分:1)
public void actionPerformed(ActionEvent arg0) {
changeLabelAndExecuteTask(1)
}
public void changeLabelAndExecuteTask(int i){
labelNr.setText(Integer.toString(i));
startTimer(i);
}
public void startTimer(final int i){
//start a timer here
new Timer().schedule(new TimerTask(){
@Override
void run(){
methodTimerCall(i)
}}, 0);
}
public void methodTimerCall(int i){
//execute things here
if(++i < 6){
changeLabelAndExecuteTask(i);
}
}
您可以添加静态布尔值并通过计时器重置它:
bool waitForTimer = false;
public void actionPerformed(ActionEvent arg0) {
for (int i = 1; i < 6; i++) {
waitForTimer = true;
labelNr.setText(Integer.toString(i));
startTimer();
while(waitForTimer){}
}
}
public void startTimer(){
//start a timer here
}
public void methodTimerCall(){
//execute
waitForTimer = false;
}
答案 1 :(得分:0)
一种有效的方法可能是将代码置于for循环中的单独方法中,并使用&#39; startTime()&#39;方法在执行结束时调用此方法。这样可以保证它在方法完成时运行,而不是在任意时间运行(即使用Thread.sleep();)
答案 2 :(得分:-1)
我认为你可以使用Thread.sleep();
。像这样:
for(int i = 1; i < 6; i++){
labelNr.setText(Integer.toString(i));
Thread.sleep(timeIWantToWait);
}