繁体   English   中英

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

[英]Displaying information from multiple threads in a single JFrame

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

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

正如MadProgrammer指出的那样,一种不错的封装方法是SwingWorker

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

对Swing组件的所有更新都必须在Swing事件分配线程上完成(有一些例外,但此处不相关)。 这是通过SwingUtilities.invokeLater() (有时是invokeAndWait() )实现的。

然后,Swing运行时将使您要进行的更改排队,并一次将其调用一次。 这使得更新文本区域的整个问题变得微不足道:只需创建一个要添加文本的Runnable,然后将其传递给invokeLater() ,然后让Runnable抓取文本区域的文档模型,然后将所需的文本附加到它。

SwingWorker可以封装一些后台线程管理的复杂性,但是我建议您用“硬方法”来做一两个时间(而用例实际上更容易用“硬方法”来做)。 这样,您就可以在需要时欣赏SwingWorker为您所做的工作。

您无需将现有线程转换为SwingWorker 只是让他们不时以这种方式将消息发送到JFrame:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM