3

我有一个扩展 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);
        }
    });
4

2 回答 2

3

只有直接影响 GUI 的事情才需要在 EDT 上执行。即使变量是 GUI 对象的成员,也不一定需要从 EDT 以独占方式访问它。由于这是您自己添加的成员,并且您确定它不会与 GUI 交互,因此您可以在任何您喜欢的线程中随意更改它。

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

不过,听起来确实x可能属于其他地方。

于 2012-08-13T10:25:11.577 回答
1

如果x是 UI 元素(JTextfield、JTable、javax.swing.*),那么您将需要使用 EDT,就像您在示例中所做的那样。

否则,我看不到任何适用于此的限制。

于 2012-08-13T07:37:15.637 回答