请看下面的代码:
请考虑以下代码:
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);
}
});
}
}
MyClass
在Swing线程上创建并执行。在其执行过程中,会启动第二个线程,该线程最终将调用 methodCalledByAnotherThread()
方法。请注意,该方法永远不会在Swing线程上被调用。
methodCalledByAnotherThread()
创建一个(本地)DefaultTreeModel
对象,并对其进行一些操作,但由于此操作不在Swing线程上,因此无法将模型设置到 jTree
中,因此需要调用 SwingUtilities.invokeLater()
。在可运行对象中,在Swing线程上执行的情况下,将局部 DefaultTreeModel
t 设置到 JTree
中。
我的问题是(实际上我还没有编译和运行这段代码,所以可能不起作用):上述是否是不良编程实践?如果是,那么如何将在非Swing线程上创建的 TreeModel
设置到Swing对象中?