1

我在一个要动态更新的类中有一个 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
     }
}
4

2 回答 2

3

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

使用execute启动 worker。将任何需要的调用console.write移至doInBackgrounddone

于 2013-05-19T02:25:25.247 回答
0

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

我认为 invokeLater() 是“将其放入待办事项队列中”,而将 invokeAndWait() 视为“将其放入待办事项队列中,您执行时我将暂停”。我不知道此更改是否会解决您的问题,但根据您告诉我们的内容,似乎可以尝试一下。

于 2013-05-19T02:13:38.163 回答