我正在将文件的内容加载到JList
组件。如果我在主线程中加载,一切似乎都没问题 - 加载内容。但是当我将代码加载到单独的线程中时,选择列表中的项目并尝试重新加载列表,我会得到随机NullPointer
或IndexOutOfBounds
个例外。我确定这是某种Swing线程问题,但无法确定是什么。
这是我的线程代码:
@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
}
Controller负责倾听:
@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);
循环让线程挂起 - 然后一切正常。如果我在没有选择列表中的项目的情况下点击重新加载,一切都会正常工作。
有人能解释我在这里缺少什么吗?
答案 0 :(得分:4)
Swing组件通常不是线程安全的。这意味着只有Swing工作线程才能进行任何修改:
Runnable worker = new Runnable() {
public void run() {
jList.setListData(textLines.toArray());
}
};
SwingUtilities.invokeLater(worker);
另见:
答案 1 :(得分:2)
Swing不是线程安全的,因此当您从其他线程操作GUI元素时,可能会出现许多奇怪的事情。在您的情况下,最简单的解决方案(但可能不是最好的)将是使用SwingUtilities.invokeLater