是否在EDT上调用

时间:2012-08-12 21:58:45

标签: java swing

我有一个扩展JFrame的类名Foo。 Foo类有几个组件,一个对象x作为私有字段,那些组件从不使用对象x,反之亦然(意味着组件完全独立于x)。当然Foo类的实例化放在EDT中,但情况是我要从非EDT线程改变对象x的值就像(Foo.x.getValue()== .... 。)它应该放在EDT内吗?如果它看起来像这样:

SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            foo.x.setValue(newValue);
        }
    });

2 个答案:

答案 0 :(得分:3)

只需要在EDT上执行直接影响GUI的内容。即使变量是GUI对象的成员,也不一定需要从EDT专门访问它。由于这是您自己添加的成员,并且您确信它不会与GUI交互,因此您可以随意在您喜欢的任何主题中更改它。

即使您的某个组件读取x以确定其显示方式,您也可以在任何您喜欢的线程中修改x,只要GUI更新本身在EDT上完成 - 如果x被多个线程使用,请确保volatilex

听起来{{1}}可能属于其他地方。

答案 1 :(得分:1)

如果x是一个UI元素(JTextfield,JTable,javax.swing。*),则需要使用EDT,就像在示例中一样。

否则,我认为这里没有任何限制。