Java - 等待循环直到方法完成,然后继续

时间:2015-11-24 15:13:14

标签: java loops timer synchronization jlabel

我需要运行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是可能的解决方案,但我不知道如何正确实现它......

提前致谢。

3 个答案:

答案 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);
}