2012-05-01 35 views
1

我试图动态地添加/附加文本到JTextArea。我试着这样做:使用Java动态添加文本到JTextArea

for(int i=0;i<10;i++){ 
    jtextArea.append("i="+i); 
    //some processing code*********** 
} 

其实所有ifor循环结束后追加到JTextArea中。但是我想将i值添加到jtextAres中,因为for循环正在进行。提前致谢。

回答

3

我假设您在事件调度线程上执行此操作,您的处理代码将阻止此线程。因此,JTextArea无法重新绘制。

您需要获取UI线程的处理代码。正常的建议是使用SwingWorker,但在这种情况下,只需使用常规Thread并使用SwingUtilities.invokeLater在EDT上调度append调用可能会更容易。

注意:我建议在JDK1.7的EDT上调用append,该方法的javadoc不再声明它是线程安全的(1.6 javadoc仍然提到这一点)。但是看看this question显示,即使在1.6版本中,您可能也更安全地在美国东部时间将其称为更安全。

Concurrency in Swing教程是一个很好的阅读关于这个主题。

3

我不知道如果我理解你的问题很好,但尝试这样的代码:

for(int i = 0; i < 10; i++) 
{ 
    final int x = i; 
    SwingUtilities.invokeAndWait(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      jtextArea.append("i=" + x); 
     } 
    }); 

    //some processing code*********** 
} 
+0

如果for循环的EDT进入(我怀疑,因为更新不可见)此次荣获”做一件事。当然,如果它不在EDT上,并且他正在使用Java 7,而且附加程序看起来不再是线程安全的,则这是一个非常好的建议。我们显然需要更多信息 – Robin