0

JEditorPaneユーザーが Java コードを入力してコンパイルできるプログラムを設計しています。その後、新しいプロセスでプログラムを実行できます。出力はJTextArea. これをメンバーとして拡張JTextAreaおよび追加することでこれを実現します。

private OutputStream writer = new OutputStream() {
    public void write(int b) {
        Console.this.append(String.valueOf((char) b));
    }
};

次に、 thisを a でラップしgetStream()て返す単純なメソッドを用意し、 andをで呼び出します。OutputStreamPrintWriterSystem.setOut()System.setErr()PrintWriter

ここで問題が発生します。大量の出力が一度にコンソールに送信されるプログラムをユーザーがコンパイルすると (System.out.println()呼び出しの無限ループなど)、GUI 全体がハングします。を使用して呼び出しSwingWorkerを処理することでこれを修正しようとしましたが、何も機能していないようです。append()

に大量のテキストが書き込まれている場合でも、GUI の応答性を維持する方法はありJTextAreaますか? 問題の一部は、呼び出し後に GUI を更新するのにかかる時間であると想定していappend()ます。JTextAreaユーザーがボタンをクリックしてプロセスを終了できるように、への書き込みを少し遅らせる方法はありますか?

4

1 に答える 1

4

あなたの問題はあなたがあなたのOutputStreamに書いている方法であるかどうか疑問に思います。おそらく、EDTからStringBuilderオブジェクトに書き込む必要があります。次に、「\ n」が表示されたら、EDTの文字列をJTextAreaに追加します。

このようなもの:

// this is all called in a background thread
public void write(int b) throws IOException {

  if (b == '\r')
     return;

  if (b == '\n') {
     final String text = sb.toString() + "\n";
     SwingUtilities.invokeLater(new Runnable() {
        // except this is queued onto the event thread.
        public void run() {
           textArea.append(text);
        }
     });
     sb.setLength(0);

     return;
  }

  sb.append((char) b);
}
于 2012-06-05T02:15:11.573 に答える