在单个JFrame中显示来自多个线程的信息

时间:2014-11-12 03:02:07

标签: java multithreading swing

我启动一个java类的(线程)实例,它接收一个“输入”并基于它在标准输出(屏幕)上生成一个“输出”。我想添加一个选项,使我能够将此输出发送到单个JFrame(文本区域)。这样做的最佳方式是什么?到目前为止,我的程序完全没有GUI,但我想让它更友好,并添加此选项。

挑战在于,在任何给定的点上我都可以运行多个线程。任何设计或代码片段都将不胜感激。

2 个答案:

答案 0 :(得分:2)

正如MadProgrammer指出的那样,一个很好的,封装的方法是SwingWorker

那就是说,这是一般理论:

Swing组件的所有更新必须在Swing事件派发线程上完成(有一些例外,但这里不相关)。这是通过SwingUtilities.invokeLater()(偶尔invokeAndWait())实现的。

然后,Swing运行时将对您要进行的更改进行排队,并一次调用一个。这使得更新文本区域的整个问题变得非常简单:只需创建一个包含要附加的文本的Runnable,将其传递给invokeLater(),然后让Runnable获取文本区域的文档模型并附加所需的文本给它发短信。

SwingWorker可以封装后台线程管理的一些复杂性,但我鼓励你在一两次“艰难的”方式下做(并且你的用例实际上更容易做'硬盘' “)。这样,您可以在需要时欣赏SwingWorker为您所做的事情。

答案 1 :(得分:1)

您无需将现有主题转换为SwingWorker。只是让他们不时以这样的方式向JFrame发送消息:

  EventQueue.invokeLater(new Runnable(){
       // update GUI
  });

为避免样板代码,最好使用java.lang.reflect.Proxy将编程接口包装到屏幕上。这种包装的一个例子是SwingProxyActorTest.java