【问题标题】:JList setListData threading issuesJList setListData 线程问题
【发布时间】:2010-12-28 15:27:07
【问题描述】:

我正在将文件内容加载到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); 循环让线程挂起 - 然后一切正常。如果我在没有选择列表中的项目的情况下点击重新加载,那么一切正常。

谁能解释我在这里缺少什么?

【问题讨论】:

  • 您错过了几乎所有与 Swing 组件相关的操作都必须在 EDT 上完成?

标签: java multithreading swing jlist


【解决方案1】:

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

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

另见:

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多