2013-05-19 45 views
1

我有一个JTextArea里面我想动态更新的类。目前它只显示所有处理完成后我附加的文本。我曾试图执行以下操作,解决它:JTextArea不动态更新

public NewConsole(){ 
    initComponents(); 
} 

public void write(final String s){ 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textarea.append(s); 
      } 
      }); 
    } 

控制台获取一个父类实例化:

protected NewConsole console = new NewConsole(); 

,并输出到它,所有的孩子们叫:

console.write("Append this.."); 

编辑:这里有一些更多的信息:

public abstract class Parent{ 
    protected NewConsole console = new NewConsole(); 

    public Parent(){} 

    protected abstract int doSomething(); 
} 

public class Child extends Parent{ 

    public Child(){ 
      console.write("I want this to update dynamically"); 
      doSomething(); 
      console.write("And this.."); 
    }  

    public int doSomething(){ 
      //Quite intensive processing here 
    } 
} 
+0

你有什么错误吗? – acdcjunior

+1

为了更好地为您提供帮助,请发布[SSCCE](http://sscce.org/) – Reimeus

+0

如果没有'invokeLater',它是否有效? – acdcjunior

回答

0

您可以尝试调用invokeAndWait()来代替invokeLater(),但事实上没有足够的信息来确定答案。

我认为invokeLater()是“把它放在你要做的事情的队列中”,而invokeAndWait()是“把它放在要做的事情的队列中,当你做它时我会暂停。我不知道这个改变是否能解决你的问题,但是根据你告诉我们的内容,这似乎是一些尝试。

+0

试过了,没有运气。我也尝试将大量的处理放在一个新的Thread()中,但它也不起作用。 – user2341412

3

doSomething中完成的密集处理阻止了EDT,防止了UI更新。改为使用SwingWorker来执行此功能。

使用execute启动工作人员。将任何所需的呼叫转移至console.writedoInBackgrounddone

+0

谢谢。我一直在看SwingWorker,但我认为我不能实现它。在很多不同的子类中有很多对console.write()的调用。好吧 – user2341412