[英]JTextArea in other JFrame display realtime console output
我有一個“ ConsoleFrame”,該控制台應將我的控制台輸出實時顯示到JTextArea。
我重定向了輸出流:
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
updateTextArea(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextArea(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
並調用SwingUtilities.invokeAndWait方法添加新文本, 效果很好
private void updateTextArea(final String text) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
txt_console.append(text);
}
});
} catch (InterruptedException ex) {
} catch (InvocationTargetException ex) {
}
}
但是它在我的新ConsoleFrame中向我顯示此錯誤: java.lang.Error:無法從事件調度程序線程中調用invokeAndWait ,由於EDT而得到該錯誤-但是它為什么起作用以及如何修改我的代碼使其起作用好嗎
必須從EDT中調用invokeAndWait
,否則會導致異常,
請謹慎地使用invokeAndWait
,因為它可以凍結整個Swing GUI,並被RepaintManager
的異常鎖定(並非在所有情況下都只創建GUI,重新布局,刷新某些方法),然后需要重新啟動應用程序,
需要invokeAndWait
測試if (EventQueue.isDispatchThread()) {
/ if (SwingUtilities.isEventDispatchThread()) {
為true,則可以設置setText("")
/ append(""
),而不會產生任何副作用,美國東部時間(EDT),但有關將良好的實踐包裝到invokeLater
使用SwingWorker
,有實現的方法process
, publish
, setProcess
和done
, EDT by default
所有提到的方法都會通知EDT by default
,
SwingWorker
被指定為僅運行一次,以便重復(在一段時間內)將Executor
用於SwingWorker
或Runnable#Thread
是最簡單,清晰且沒有任何副作用,影響的
您可以從任何線程使用SwingUtilities.invokeLater()
,並且對於錯誤流,即使您已經在EDT中,也可能最好使用它:
private void updateTextArea(final String text) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
txt_console.append(text);
}
});
}
您遇到的特定錯誤來自EDT外部,然后可能調用invokeAndWait()
以便將輸出輸出到控制台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.