这是一种糟糕的编程实践吗 请考虑以下代码: public class MyClass extends javax.swing.JFrame { private JTree jTree; //Code ommited for clarity public void methodCalledByAnotherThread(){ final DefaultTreeModel t = new DefaultTreeModel(); //Do some thing with t SwingUtilities.invokeLater(new Runnable(){ public void Run(){ jTree.setModel(t); } }); } }

这是一种糟糕的编程实践吗 请考虑以下代码: public class MyClass extends javax.swing.JFrame { private JTree jTree; //Code ommited for clarity public void methodCalledByAnotherThread(){ final DefaultTreeModel t = new DefaultTreeModel(); //Do some thing with t SwingUtilities.invokeLater(new Runnable(){ public void Run(){ jTree.setModel(t); } }); } },java,multithreading,swing,Java,Multithreading,Swing,MyClass在Swing线程上创建和执行。在执行过程中,它会启动第二个线程,该线程最终将调用被调用的方法byanotherthread()。不是,这个方法永远不会在Swing线程上调用 MethodCalledByOnotherThread()创建一个(本地)DefaultTreeModel对象并对其进行一些处理,但由于该对象不在Swing线程上,因此无法将模型设置为jTree,因此调用SwingUtilities.invokeLater()。在Swing线程上执行的可运行对象中,它将本地De

MyClass
在Swing线程上创建和执行。在执行过程中,它会启动第二个线程,该线程最终将调用被调用的
方法byanotherthread()
。不是,这个方法永远不会在Swing线程上调用

MethodCalledByOnotherThread()
创建一个(本地)
DefaultTreeModel
对象并对其进行一些处理,但由于该对象不在Swing线程上,因此无法将模型设置为
jTree
,因此调用
SwingUtilities.invokeLater()
。在Swing线程上执行的可运行对象中,它将本地
DefaultTreeModel
t设置到
JTree

我的问题是(实际上我还没有编译和运行这段代码,所以它可能不起作用)。。上述编程实践是否糟糕?如果是这样,如何将在非Swing线程上创建的
TreeModel
设置为Swing对象

看起来不错(事实上这是最好的方法)。只要
//使用t做一些事情
不包括任何已经显示在UI上的元素。

1)不要
在更多方面扩展javax.swing.JFrame
,例如

2) 从current
JTree
实例中创建
getModel
比在运行时重新创建
DefaultTreeModel
更好,可能不知道生命周期


3) 正确的是,您通过包装到
invokeLater
来添加
model
,建议最简单的方法是从
Runnable#Thread
,最好是从
SwingWorker

感谢您的快速回复。您是否有任何参考资料表明这是一种正确的方法?我发现在这个问题中:就我所知,关于您的#2树模型是不线程安全的。因此,修改现有线程将从另一个线程中删除应该被认为是一种糟糕的编程实践。@你的
考虑糟糕的编程实践
可能是默认方式如何将DefaultXxxModel从后台任务添加/更新到后台任务,从其他线程修改非线程安全对象不是我的问题:)我不认为这是默认方式从当前
JTree
返回一个
AbstractXxxModel
。。。