4

コンソール出力をリアルタイムで JTextArea に表示する「ConsoleFrame」があります。

出力ストリームをリダイレクトしました:

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が 原因でそれが発生します.ちゃんと?

4

2 に答える 2

2
  • invokeAndWaitEDT から呼び出す必要があります。そうしないと、例外が発生します。

  • invokeAndWaitSwing GUI 全体がフリーズし、例外によってロックされる可能性があるためRepaintManager(常に GUI のみが作成されるわけではなく、再レイアウトされ、いくつかのメソッドがリフレッシュされるわけではありません)、その後、アプリケーションを再起動する必要がありました。

  • forinvokeAndWaitはテストする必要がありますif (EventQueue.isDispatchThread()) {/ if (SwingUtilities.isEventDispatchThread()) {on true できますsetText("")/ append("") 副作用なしで、出力は EDT で行われますが、内部にラップすることをお勧めしますinvokeLater

  • 使用SwingWorker、実装されたメソッドprocesspublishsetProcessおよびがありdone、言及されたすべてのメソッドが通知されますEDT by default

  • SwingWorker1 回だけ実行し、繰り返し (ある期間) 使用するように指定されてExecutorSwingWorkerますRunnable#Thread

于 2013-07-17T17:37:20.743 に答える
0

任意のスレッドから使​​用SwingUtilities.invokeLater()できます。また、エラー ストリームの場合は、既に EDT にいる場合でも使用するのが最適です。

private void updateTextArea(final String text) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            txt_console.append(text);
        }
    });
}

発生する特定のエラーは EDT の外部から発生invokeAndWait()し、コンソールに出力を取得するために呼び出される場合があります。

于 2013-07-17T17:27:13.997 に答える