修复由于JTextArea而无响应的GUI?

时间:2012-06-05 02:02:41

标签: java swing user-interface jtextarea event-dispatching

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

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

然后我有一个简单的getStream()方法,返回OutputStream包裹的PrintWriter,并使用{{1}调用System.setOut()System.setErr() }。

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

即使有大量文本写入append(),有没有办法让GUI保持响应?我假设问题的一部分是JTextArea调用后更新GUI所花费的时间。有没有办法延迟写入append()一小部分,以便用户可以点击按钮终止该过程?

1 个答案:

答案 0 :(得分:4)

我想知道你的问题是否是你在OutputStream中写的方式。也许您应该写入EDT的StringBuilder对象 off ,然后当出现“\ n”时,将EDT上的String追加到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);
}