我知道秋千组件,应该从事件调度线程中调用它们通过在事件调用中调用听众来定义。但是我读到其他线程不应与UI通信,因为它没有同步。
大多数书籍只是教如何使用单个组件而不是如何使用如何使用 在现实世界的应用程序上下文中使用它们。
如何更新完整的状态或在秋千组件中的过程线程状态。
update :如果我们配置了侦听器以在ExecutorService
中调用作业,那么工作线程如何以安全的方式更新UI组件。
最安全的方法是使用
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
内部运行方法您可以操纵秋千组件
基本答案是调用 repaint
。
AWT/Swing背后的想法是,可以随时显示,调整大小,移动等(通过代码或通过用户交互)提示重新粉刷的需求。因此,当您进行更新时,应更新渲染将基于的model
...有时需要在EDT上进行此操作以保持一致性,然后使用RepAlt来显示模型的更改
您可以...
使用SwingUtilities.invokeLater
安排将来在EDT上执行的回调。
问题的问题是在线程之间同步数据,因为更新可能需要的数据可能不再与呼叫进行
时相同您可以...
使用SwingWorker
。这提供了一种手段,可以在数据传递到process
方法时同步背景线程和EDT之间的数据更改,因此它可以在"相关"相关"上行动。在调用时,数据降低了对UI可能需要的数据访问
更新:如果我们配置了侦听器以在执行人员服务中调用作业,那么工作线程如何以安全的方式更新UI组件。
SwingWorker
本身与ExecutorService
兼容,您可以将SwingWorker
的实例添加到它,整洁的技巧;)
例如
EDT的唯一工作是致电您的处理程序。您可以"与之交流"的唯一方法是注册处理程序以供拨打它。(注意:invokeLater(...)
方法只是注册EDT将立即致电的处理程序的一种方式。)
我读到其他线程不应与UI通信,因为...
不要在"交流"方面考虑一下。用在共享对象上操作的线程来考虑它。您应该说的是:"其他线程绝不应该在秋千对象上操作。"
其他线程可以在您的对象上操作,然后您的对象可以在EDT调用其paint(g)
方法时在屏幕上显示其更新的状态。