繁体   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