Java JList随机抛出边界概念的ArrayIndex
我正在尝试以异步方式向JList添加项目,但我经常从另一个线程获得异常,例如:Java JList随机抛出边界概念的ArrayIndex,java,swing,Java,Swing,我正在尝试以异步方式向JList添加项目,但我经常从另一个线程获得异常,例如: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 8 有人知道如何解决这个问题吗 (编辑:我回答了这个问题,因为它一直困扰着我,而且没有搜索引擎友好的方式来查找此信息。)您是否可能从其他线程修改它?可能是在执行JList(或相关)方法期间在同一线程中修改它,该方法期望内容保持相同大小。模型接口不是线程安全
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 8
有人知道如何解决这个问题吗
(编辑:我回答了这个问题,因为它一直困扰着我,而且没有搜索引擎友好的方式来查找此信息。)您是否可能从其他线程修改它?可能是在执行
JList
(或相关)方法期间在同一线程中修改它,该方法期望内容保持相同大小。模型接口不是线程安全的。只能在EDT中修改模型
它不是线程安全的,因为它要求与内容分开的大小。Swing组件不是线程安全的,有时可能抛出异常。在清除和添加元素时,JList尤其会抛出 解决这个问题的方法,以及在Swing中异步运行东西的首选方法,是使用。它确保在所有其他请求发生时完成异步调用 使用
SwingWorker
(实现Runnable
)的示例:
提供有关如何将项目添加到此列表的详细信息。你用你自己的模型吗?啊。我本来打算自己回答这个问题的,因为我已经解决这个问题好几个小时了,在上面查找(在这里插入你最喜欢的搜索引擎)。@spoike-在这种情况下,我建议你在问题中告诉我,或者在旁边键入答案,为了避免人们争先恐后地回答问题,你无论如何都会完整地回答。@Gnoupi:对不起。;)我将添加一篇关于这一点的简介。文章“Swing中的并发性”在“初始线程”一节中阐述了这一点。您可能需要添加问题的链接
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void> () {
@Override
protected Void doInBackground() throws Exception {
Collection<Object> objects = doSomethingIntense();
this.myJList.clear();
for(Object o : objects) {
this.myJList.addElement(o);
}
return null;
}
}
// This WILL THROW EXCEPTIONS because a new thread will start and meddle
// with your JList when Swing is still drawing the component
//
// ExecutorService executor = Executors.newSingleThreadExecutor();
// executor.execute(worker);
// The SwingWorker will be executed when Swing is done doing its stuff.
java.awt.EventQueue.invokeLater(worker);
// This is actually a cool one-liner:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Collection<Object> objects = doSomethingIntense();
this.myJList.clear();
for(Object o : objects) {
this.myJList.addElement(o);
}
}
});