gpt4 book ai didi

java - JList 随机抛出 ArrayIndexOutOfBoundsExceptions

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:26 26 4
gpt4 key购买 nike

我正在尝试将项目异步添加到 JList,但我经常从另一个线程收到异常,例如:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 8

有人知道如何解决这个问题吗?

(编辑:我回答了这个问题,因为它一直困扰着我,而且没有明确的搜索引擎友好的方式来查找此信息。)

最佳答案

Swing 组件不是线程安全的,有时可能会抛出异常。 JList 特别会抛出 ArrayIndexOutOfBounds exceptions清除和添加元素时。

解决这个问题的方法,也是在 Swing 中异步运行事物的首选方法,是使用 invokeLater method .它确保异步调用在所有其他请求时完成。

使用 SwingWorker 的示例(它实现了 Runnable):

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);

当然,您不需要使用 SwingWorker,因为您可以像这样实现 Runnable:

// 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);
}
}
});

关于java - JList 随机抛出 ArrayIndexOutOfBoundsExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com