我启动一个java类的(线程)实例,它接收一个“输入”并基于它在标准输出(屏幕)上生成一个“输出”。我想添加一个选项,使我能够将此输出发送到单个JFrame(文本区域)。这样做的最佳方式是什么?到目前为止,我的程序完全没有GUI,但我想让它更友好,并添加此选项。
挑战在于,在任何给定的点上我都可以运行多个线程。任何设计或代码片段都将不胜感激。
答案 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。