Пожалуйста, обратите внимание на следующий код:это плохо практике программирования
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?
благодарит за ваш быстрый ответ. У вас есть ссылки, говорящие, что это правильный путь? – Kerry
Я нашел, что в этом вопросе размещен: http://stackoverflow.com/questions/5895481/update-jlabel-from-another-thread –