2012-02-02 4 views
3

Пожалуйста, обратите внимание на следующий код:это плохо практике программирования

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 создается и выполняется на свинг потоке. Некоторое время во время его запуска запускает второй поток, который в конечном итоге вызовет methodCalledByAnotherThread(). Не этот метод НИКОГДА не будет вызван нитью Swing.

methodCalledByAnotherThread() создает (локальный) DefaultTreeModel объект и делает некоторую работу с ним, но потому что это не на свинг нить не может установить модель в jTree отсюда призыв к SwingUtilities.invokeLater(). В объекте Runnable, который выполняется в потоке Swing, он устанавливает LOCAL DefaultTreeModel t в JTree.

Мой вопрос (и я на самом деле не скомпилировал и не запустил этот код, чтобы он мог не работать) .. является ли это практикой программирования BAD? Если да, то как я могу установить TreeModel, созданный в потоке NOW-Swing, в объект Swing?

ответ

3

Это выглядит отлично (на самом деле это лучший способ сделать это). Пока //Do some thing with t не содержит элементов, которые уже отображаются в пользовательском интерфейсе.

+0

благодарит за ваш быстрый ответ. У вас есть ссылки, говорящие, что это правильный путь? – Kerry

+0

Я нашел, что в этом вопросе размещен: http://stackoverflow.com/questions/5895481/update-jlabel-from-another-thread –

3

1) не extends javax.swing.JFrame больше в Composition versus Inheritance, e.i.

2) лучше бы getModel от currnet JTree экземпляра Rathen, чем воссоздать DefaultTreeModel во время выполнения и, возможно, с un_know жизненного цикла

3) правильно, что вы добавления model, обернув в invokeLater, предложение приемлемо Самый простой способ из Runnable#Thread, лучше от SwingWorker,

+0

Что касается вашего # 2 TreeModel, это не потокобезопасно, насколько мне известно. Таким образом, изменение существующего из другого потока (-ов) должно рассматриваться как плохая практика программирования. –

+0

@ ʘЛег ваш 'рассмотрение для плохой практики программирования' может быть способом по умолчанию, как добавлять/обновлять DefaultXxxModel из фоновой задачи в Swing GUI – mKorbel

+0

Модификация объектов, не связанных потоками из других потоков, по умолчанию не является моей проблемой :) –

Смежные вопросы