JList setListData线程问题

时间:2010-12-28 15:27:08

标签: java multithreading swing jlist

我正在将文件的内容加载到JList组件。如果我在主线程中加载,一切似乎都没问题 - 加载内容。但是当我将代码加载到单独的线程中时,选择列表中的项目并尝试重新加载列表,我会得到随机NullPointerIndexOutOfBounds个例外。我确定这是某种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);循环让线程挂起 - 然后一切正常。如果我在没有选择列表中的项目的情况下点击重新加载,一切都会正常工作。

有人能解释我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:4)

Swing组件通常不是线程安全的。这意味着只有Swing工作线程才能进行任何修改:

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

另见:

答案 1 :(得分:2)

Swing不是线程安全的,因此当您从其他线程操作GUI元素时,可能会出现许多奇怪的事情。在您的情况下,最简单的解决方案(但可能不是最好的)将是使用SwingUtilities.invokeLater