编程语言
首页 > 编程语言> > java – JTextArea在其他JFrame中显示实时控制台输出

java – JTextArea在其他JFrame中显示实时控制台输出

作者:互联网

我有一个“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而得到了 – 但为什么它可以工作?如何调整我的代码以使其正常工作?

解决方法:

> invokeAndWait必须在EDT之外调用,否则会导致a.m.异常,
>小心使用invokeAndWait,因为可以冻结整个Swing GUI,由RepaintManager的异常锁定(并非在所有情况下只创建GUI,重新启动,刷新一些方法),然后应用程序需要重启,
> for invokeAndWait需要测试if(EventQueue.isDispatchThread()){/ if(SwingUtilities.isEventDispatchThread()){on true你可以setText(“”)/ append(“”)没有任何副作用,输出完成在EDT上,但是关于在invokeLater中包装的好实践
>使用SwingWorker,实现方法process,publish,setProcess和done,所有提到的方法默认通知EDT,
> SwingWorker被指定只运行一次,重复(在某个时期)使用Executor for SwingWorker或Runnable #Thread作为最简单,清晰且没有任何副作用,效果

标签:java,swing,scheduled-tasks,jtextarea,swingutilities
来源: https://codeday.me/bug/20190703/1368923.html