2013-05-19 43 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