2010-12-28 3 views
2

Я загружаю содержимое файла в JList. Если я загружаю основной поток, все кажется ОК - содержимое загружено. Но когда я перемещаю код загрузки в отдельный поток, выберите элемент в списке и попробуйте перезагрузить список, я получаю случайные NullPointer или IndexOutOfBounds исключения. Я уверен, что это какая-то проблема с потоками Swing, но не могу определить, что.JList setListData проблемы с потоком

Это мой код Тема:

@Override 
public void run() { 
    List<String> textLines = null; 
    textLines = splitter.split(model.getLedMaxChars(), textLoader.loadText(file)); 
    listener.onTextLoaded(textLines);//listener is in main Swing code 
} 

контроллер отвечает за прослушивание:

@Override 
public void onTextLoaded(List<String> textLines) { 
    view.fileLoaded(model.getCurrentFile()); 
    view.setTextLines(textLines); 
    view.enableListComponent(); 
} 

И вид обновления:

public void setTextLines(List<String> textLines) { 
    jList.setListData(textLines.toArray()); 
} 

Я пытался оставить нить зависайте, добавив while(true); loop - тогда все работает нормально. Если я удалю перезагрузку, не выбрав элемент в списке, все будет работать.

Может ли кто-нибудь объяснить, что мне здесь не хватает?

+2

Вам не хватает того, что почти каждая операция, связанная с компонентами Swing, должна выполняться на EDT? – SyntaxT3rr0r

ответ

4

Компоненты Swing обычно не являются потокобезопасными. Это означает, что только свинг рабочий поток должен делать какие-либо изменения:

Runnable worker = new Runnable() { 
    public void run() { 
    jList.setListData(textLines.toArray()); 
    } 
}; 
SwingUtilities.invokeLater(worker); 

Смотрите также:

2

свинг не поточно, поэтому, когда вы манипулируя элементами GUI из других потоков, может возникнуть множество странных вещей. В вашем случае простейшим решением (но, вероятно, не лучшим) было бы использовать SwingUtilities.invokeLater

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