请考虑以下代码:

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上已经显示的任何元素。

08-05 06:25
查看更多