Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JList随机抛出边界概念的ArrayIndex_Java_Swing - Fatal编程技术网

Java JList随机抛出边界概念的ArrayIndex

Java JList随机抛出边界概念的ArrayIndex,java,swing,Java,Swing,我正在尝试以异步方式向JList添加项目,但我经常从另一个线程获得异常,例如: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 8 有人知道如何解决这个问题吗 (编辑:我回答了这个问题,因为它一直困扰着我,而且没有搜索引擎友好的方式来查找此信息。)您是否可能从其他线程修改它?可能是在执行JList(或相关)方法期间在同一线程中修改它,该方法期望内容保持相同大小。模型接口不是线程安全

我正在尝试以异步方式向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);
        }
    }
});