【发布时间】:2016-01-11 22:57:41
【问题描述】:
我一次又一次地遇到了 Swing 一直遇到的问题。 Swing 不适合程序员处理自己的异步操作。
现在摆在我面前的是一个典型的问题,它经常被诸如“让 Swing 的 EDT 处理异步任务”或“稍后使用调用”之类的答案所困扰。
通常情况下,如果我从头开始构建整个应用程序,这就是我要走的路。然而,我不是。我目前拥有的是一个程序(我不应该以任何方式修改),它在自己的线程中运行并触发自己设计的异步更新事件。我想使用 Swing 为其制作 UI 包装器,在面板中显示应用程序,同时提供与底层程序交互的按钮。
现在,我真的不想因此而掉头发。我不会一次几个小时地正面解决这个问题而没有进展。如果对这个问题没有可接受的答案,我将简单地使用 OpenGL 包装器(这是正确的“简单”)。
问题
在 Java Swing 中是否有包装这种性质的多线程应用程序的常规方法?
该方法是否允许被动查看不断变化的模型? (没有 UI 鼠标或键盘事件,但仍会更新)
如果没有常规方法,是否有针对我正在尝试做的事情的 hack、bodge 或其他管道胶带解决方案?
未能识别应用程序的异步部分在另一个程序中并建议修改该程序的答案将被视为非建设性的,并将被标记为离题。
如果您需要更多信息,请发表评论,我会尽可能多地披露。
【问题讨论】:
-
“在 Java Swing 中是否有包装这种性质的多线程应用程序的常规方法?” -
SwingWorker或SwingUtilties.invokeLater想到了 -
“该方法是否允许被动查看变化的模型?(没有 UI 鼠标或键盘事件,但仍会更新)”- 是的,
SwingWorker或SwingUtilities.invokeLater将关心用户与模型的交互,他们将(如果您设计这样做)只关心您的其他程序正在生成的事件。还需要仔细考虑将更新发送回您的程序,因为您不想在执行此操作时阻止 EDT(没有上下文,所以假设),但是因为其他程序似乎是事件驱动的,所以您的“观察者”应该可以应付 -
@MadProgrammer
SwingUtilities.invokeLater(...)必须从产生框架的线程中调用,不是吗? -
@MadProgrammer 我所说的被动查看的意思是,如果我查看 UI 并且模型会自我更新,那么 UI 会发生变化吗?根据您对我之前评论的回复,我已经有了答案。我不知道如果可以的话,可以从其他线程调用 invokeLater。
-
这将归结为
EventQueue,因为Runnable从invokeLater弹出到队列中
标签: java multithreading swing asynchronous