2012-06-05 26 views
0

我正在設計一個程序,其中有一個JEditorPane用戶可以輸入和編譯Java代碼。然後他們可以在新的過程中運行他們的程序,然後他們的輸出將顯示在JTextArea中。我通過延伸JTextArea和添加此作爲成員實現這一點:修復由於JTextArea而導致無響應的GUI?

private OutputStream writer = new OutputStream() { 
    public void write(int b) { 
     Console.this.append(String.valueOf((char) b)); 
    } 
}; 

我然後有一個簡單的方法getStream(),用於返回該OutputStream裹在PrintWriter,並調用System.setOut()System.setErr()PrintWriter

現在出現這個問題:如果用戶編譯一個程序,其中很多輸出一次被髮送到控制檯(例如,調用System.out.println()的無限循環),則整個GUI掛起。我試圖通過使用SwingWorker來解決這個問題來處理append()調用,但似乎沒有任何工作。

即使將大量文本寫入JTextArea,是否有辦法保持GUI的響應?我假設問題的一部分是在append()調用後更新GUI的時間量。有沒有辦法延遲少量寫入JTextArea,以便用戶可以點擊按鈕來終止進程?

+1

我希望我是錯的,但我不知道我們是否有足夠的信息能夠給你一個明確的正確答案。例如,我真的無法基於簡單的描述來猜測,爲什麼你的圖形用戶界面(GUI)掛起,而不是你可能仍在踏上美國東部時間。追加附加到JTextArea?然後你不想在後臺線程中調用它。而是應該在美國東部時間。 –

+0

但是這不會阻止我猜測! :) –

+0

我正在編寫EDT,至少根據Eclipse調試器。有沒有其他信息可以幫助? – euclio

回答

4

我不知道你的問題是你在OutputStream中編寫的方式。也許你應該寫入EDT的關閉的StringBuilder對象,然後當出現「\ n」時,將EDT上的String追加到JTextArea。

事情是這樣的:

// this is all called in a background thread 
public void write(int b) throws IOException { 

    if (b == '\r') 
    return; 

    if (b == '\n') { 
    final String text = sb.toString() + "\n"; 
    SwingUtilities.invokeLater(new Runnable() { 
     // except this is queued onto the event thread. 
     public void run() { 
      textArea.append(text); 
     } 
    }); 
    sb.setLength(0); 

    return; 
    } 

    sb.append((char) b); 
} 
+0

這可以修復GUI完全凍結,但仍然存在重大延遲。我認爲我們在這裏是正確的。 – euclio

+0

@euclio:爲了獲得更好的幫助,可以考慮像Andrew建議的那樣創建一個[SSCCE](http://sscce.org)。這意味着創建一個*小型*可編譯和可運行的程序來演示你的問題,我們可以運行和測試自己而不需要外部依賴(數據庫,文件等)。爲了創造這一點,您需要付出相當大的努力,但爲了您和我們的目的,這將非常值得。請查看鏈接瞭解更多細節。 –

相關問題