簡體   English   中英

其他JFrame中的JTextArea顯示實時控制台輸出

[英]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 ,有實現的方法processpublishsetProcessdoneEDT by default所有提到的方法都會通知EDT by default

  • SwingWorker被指定為僅運行一次,以便重復(在一段時間內)將Executor用於SwingWorkerRunnable#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM