如何与其他线程中的事件调度线程或摆动组件进行通信



我知道秋千组件,应该从事件调度线程中调用它们通过在事件调用中调用听众来定义。但是我读到其他线程不应与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)方法时在屏幕上显示其更新的状态。

最新更新