JTextArea附加for循环的结果

时间:2013-08-20 20:53:42

标签: java swing timer

我有代码:

   Timer timer = new Timer(5000, new ActionListener() {
          public void actionPerformed(ActionEvent e) {

             for(int i=0;i<10;i++){
            textArea1.append("   "+i + "\n" + newline);
            textArea1.setCaretPosition(textArea1.getDocument().getLength());
             }
          }
       });
  ...
  ...
  timer.start();

它会一起追加0到9。我想逐个打印0到9。这意味着,在GUI JTextArea上,它将显示0,和1,然后是2 ......每个数字之间有一点延迟。我已经问过这个问题,但问题似乎太混乱了。所以我写了上面更简单的例子。请帮忙。如果你们感兴趣的话,这是这个问题的原始问题:java for-loop in GUI TextArea

2 个答案:

答案 0 :(得分:4)

这可能会做你想要的:

Timer timer = new Timer(5000, new ActionListener() {
      private int i = 0;
      public void actionPerformed(ActionEvent e) {
        if (i > 10) {
          timer.stop();
        } else {
          textArea1.append("   "+i + "\n" + newline);
          textArea1.setCaretPosition(textArea1.getDocument().getLength());
          i++;
         }
      }
   });
...
...
timer.start();

在评论中,提到timer需要成为一个字段,如图所示。如果您希望它是方法的局部变量,那么该方法将如下所示。

请注意,timer必须是最终才能在匿名内部类中使用。但要做到这一点,你必须通过构造没有任何监听器的计时器来解决问题,创建监听器然后添加它。

public void doit() {
    final Timer timer = new Timer(5000, null);

    ActionListener a = new ActionListener() {
        private int i = 0;

        public void actionPerformed(ActionEvent e) {
            if (i > 10) {
                timer.stop();
            } else {
                textArea1.append("   " + i + "\n");
                textArea1.setCaretPosition(textArea1.getDocument().getLength());
                i++;
            }
        }
    };
    timer.addActionListener(a);
    timer.start();
}

如果你拿第一位代码然后把它放在一个方法中,你就会抱怨它不是最终的。

如果您只是将其设为最终版,则会抱怨您无法在stop()上致电timer,因为timer可能尚未初始化。

评论中提到了其他解决方案。 (谢谢你提起这件事,@ herheru)

答案 1 :(得分:-5)

如何使用Thread.sleep(10)

   Timer timer = new Timer(5000, new ActionListener() {
          public void actionPerformed(ActionEvent e) {

             for(int i=0;i<10;i++){
            textArea1.append("   "+i + "\n" + newline);
            textArea1.setCaretPosition(textArea1.getDocument().getLength());
                    Thread.sleep(10);
                 }
          }
       });
  ...
  ...
  timer.start();