请考虑以下代码:
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);
}
});
}
}
在Swing线程上创建并执行
MyClass
。在执行过程中的某个时间,它将启动第二个线程,该线程最终将调用methodCalledByAnotherThread()
。永远不会在Swing线程上调用此方法。methodCalledByAnotherThread()
创建一个(本地)DefaultTreeModel
对象并对其进行一些处理,但是由于它不在Swing线程上,因此无法将模型设置为jTree
,因此需要调用SwingUtilities.invokeLater()
。在Swing线程上执行的Runnable对象中,它将LOCAL DefaultTreeModel
t设置为JTree
。我的问题是(并且我尚未实际编译和运行此代码,因此它可能无法正常工作)..以上是BAD编程实践吗?如果是这样,如何将在非摆动线程上创建的
TreeModel
设置为Swing对象? 最佳答案
看起来不错(实际上,这是最好的方法)。只要//Do some thing with t
不包括UI上已经显示的任何元素。