【发布时间】:2013-01-20 07:54:05
【问题描述】:
编辑:我已经编辑了帖子以澄清我的问题,现在我自己有了更多的理解。
正如标题所说,我基本上是在尝试在我的 GUI 中将控制台输出到我的JTextArea,同时执行应用程序的任务。
这是我目前正在做的事情:
public class TextAreaOutputStream extends OutputStream
{
private final JTextArea textArea;
private final StringBuilder sb = new StringBuilder();
public TextAreaOutputStream(final JTextArea textArea)
{
this.textArea = textArea;
}
@Override
public void flush()
{
}
@Override
public void close()
{
}
@Override
public void write(int b) throws IOException
{
if (b == '\r')
return;
if (b == '\n')
{
final String text = sb.toString() + "\n";
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textArea.append(text);
}
});
sb.setLength(0);
}
sb.append((char) b);
}
}
上面将成功地将System.out 重定向到我上面的输出流,因此向EventQueue 发送一个事件以更新我的GUI (JTextArea)。
问题来了:
目前使用 invokeLater() 将如文档所述:
Causes runnable to have its run method called in the dispatch thread of the EventQueue. This will happen after all pending events are processed.
所以我真正想做的是在处理 EventQueue 中的所有其他内容之前对 GUI 进行更新(调用 run())。
是否可以将事件本质上注入到我的 EventQueue 中?或者有人可以指点我这方面的一个不错的教程吗?
谢谢,
【问题讨论】:
-
“上述解决方案的工作原理是我将系统输出到我的 JTextArea,但是当我尝试在 actionPerformed() 中执行此操作时,我没有得到任何输出。” 你确定你通过了所有那些 if's 吗?没有充分的理由为什么一个
System.out调用会起作用而另一个失败
标签: java swing user-interface jtextarea