0

我正在设计一个程序,JEditorPane用户可以在其中输入和编译 Java 代码。然后他们可以在新进程中运行他们的程序,然后他们的输出将显示在JTextArea. 我通过扩展JTextArea并将其添加为成员来实现这一点:

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

然后我有一个简单的getStream()方法,它返回OutputStream包装在 a 中的this PrintWriterSystem.setOut()System.setErr()使用PrintWriter.

现在问题来了:如果用户编译一个程序,其中大量输出一次发送到控制台(例如,无限循环的System.out.println()调用),整个 GUI 挂起。我试图通过使用 aSwingWorker来处理append()呼叫来解决此问题,但似乎没有任何效果。

有没有办法让 GUI 保持响应,即使大量文本被写入JTextArea? 我假设部分问题是append()通话后更新 GUI 所花费的时间。有没有办法将写入延迟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 回答