使用java swing Timer处理文本并将其追加到textarea中

时间:2014-05-11 07:53:11

标签: java swing timer actionlistener jtextarea

我有一个JTextArea txtProcess和2个要处理的方法:

第一种方法是使用for循环处理小于10的乘法数。将它们相乘后,所有结果将使用Timer附加到txtProcess。

我使用计时器来延迟追加。例如,第一个结果附加到txtProcess。然后500毫秒后,第二个结果附加到txtProcess。依此类推,直到所有结果都附加到txtProcess。

像这样:

int a = 10;
int result = 0;
for(int i=1; i <= a; i++){
    result = i * a;
    txtProcess.append("Result "+ i +" = "+ result);
}

以下是我为第一种方法尝试过的一段代码。

    void first(){
        ActionListener listen = new ActionListener(){
            public void actionPerformed(ActionEvent e){
                for(int i=1; i <= a; i++){
                    result = i * a;
                    txtProcess.append("Result "+ i +" = "+ result +"\n");
                    if(i == 9){
                        ((Timer)e.getSource()).stop();
                    }
                }
            }
        };    
        Timer mine = new Timer(500, listen);
        mine.start();
    }

但是,它不像我预期的那样有效。我期望结果一个接一个地附加到txtProcess,而不是同时。这是第一个问题。我该如何解决这个问题?

当第一个方法中的所有进程都已执行时,该进程继续第二个方法。

第一种方法与第二种方法的处理之间存在时间间隔。

我的意思是这样的:在第一个方法执行完成后,第二个方法执行将在2秒后启动。如您所见,时间间隔为2秒(或可能更长)。

所以,我试过这样:

    void second(){
        ActionListener listen = new ActionListener(){
            public void actionPerformed(ActionEvent e){
                for(int i=1; i <= a; i++){
                    result = i * a;
                    txtProcess.append("Result "+ i +" = "+ result +"\n");
                    if(i == 9){
                        ((Timer)e.getSource()).stop();
                    }
                }
            }
        };    
        Timer mine = new Timer(500, listen);
        mine.start();
    }

然后我创建了另一种方法来组合它们:

       void combine(){
            ActionListener listen = new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    first();
                    second();
                }
            };    
            Timer mine = new Timer(500, listen);
            mine.start();
        }

但是,第一和第二种方法同时执行。这是第二个问题:在第一个方法和第二个方法之间创建间隔时间。我该如何解决这个问题?

注意: 您可能认为此问题与java for-loop in GUI TextArea重复。我已经阅读并尝试了那里的代码,但它仍然无法解决问题。

1 个答案:

答案 0 :(得分:1)

Timer每次达到间隔时执行ActionListener中的代码的作用。 因此,如果您希望文本追加10次,则必须在侦听器中没有for循环。计时器将为您处理循环。

ActionListener listener = new ActionListener(){
  private int counter = 0;
  @Override
  public void actionPerformed( ActionEvent e ){
     txtProcess.append("Result "+ counter +" = "+ result);
     counter++;
     if ( counter == 10 ){
       ((Timer)e.getSource()).stop();
     }
  }
}
Timer timer = new Timer( 500, listener );
timer.start();

我没有仔细检查上面的代码,所以它可能包含语法错误或循环只有一次太多/一次少于需要。它更多地用于说明Timer的用法。