【发布时间】:2012-02-02 19:26:48
【问题描述】:
请考虑以下代码:
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 线程上执行的 Runnable 对象中,它将 LOCAL DefaultTreeModel t 设置为 JTree。
我的问题是(而且我还没有真正编译和运行这段代码,所以它可能不起作用).. 上面的编程习惯是坏的吗?如果是这样,我如何将在 NON-Swing 线程上创建的 TreeModel 设置为 Swing 对象?
【问题讨论】:
标签: java multithreading swing