gpt4 book ai didi

java - 如何避免 JFileChooser.setFileFilter() 调用中的 ConcurrentModificationException?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:59:31 24 4
gpt4 key购买 nike

我有以下代码并且刚刚得到 ConcurrentModificationException。

fchProtocol = new FileChooser(lastFileLoc);
FileNameExtensionFilter xmlfilter = new FileNameExtensionFilter("xml files (*.xml)", "xml");
fchProtocol.setFileFilter(xmlfilter); <<<< ***** exception from here

异常跟踪信息:

java.util.ConcurrentModificationException
java.util.Vector$Itr.checkForComodification(Vector.java:1184)
java.util.Vector$Itr.next(Vector.java:1137)
javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.cancelRunnables(BasicDirectoryModel.java:340)
javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.cancelRunnables(BasicDirectoryModel.java:346)
javax.swing.plaf.basic.BasicDirectoryModel.validateFileCache(BasicDirectoryModel.java:135)
javax.swing.plaf.basic.BasicDirectoryModel.propertyChange(BasicDirectoryModel.java:69)
java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
java.awt.Component.firePropertyChange(Component.java:8422)
javax.swing.JFileChooser.setFileFilter(JFileChooser.java:1473)

这是 Java API 方法代码。它是最后一行抛出异常。

public void setFileFilter(FileFilter filter) {
FileFilter oldValue = fileFilter;
fileFilter = filter;
if (filter != null) {
if (isMultiSelectionEnabled() && selectedFiles != null && selectedFiles.length > 0) {
Vector<File> fList = new Vector<File>();
boolean failed = false;
for (File file : selectedFiles) {
if (filter.accept(file)) {
fList.add(file);
} else {
failed = true;
}
}
if (failed) {
setSelectedFiles((fList.size() == 0) ? null : fList.toArray(new File[fList.size()]));
}
} else if (selectedFile != null && !filter.accept(selectedFile)) {
setSelectedFile(null);
}
}
firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, oldValue, fileFilter);
}

这发生在 GUI 初始化阶段。 xmlfileter 是一个局部变量。

我在 Linux 中使用 javaVersion = 1.8.0_20。它是不可重现的,在我的开发过程中今年只发生了三次。

我不知道如何避免这种情况,或者如何正确使用 FileChooser 及其 FileFilter。任何人都可以帮助我吗?

编辑:

它发生在应用程序初始化阶段:

  1. 主线程从 main() 开始
  2. 在主线程中初始化了几个非 GUI 类;
  3. 打电话

.

SwingUtilities.invokeAndWait(new Runnable()

public void run()
{
initalize GUI classes from here
}
);

进行 GUI 初始化,但在前几步的 GUI 初始化线程中失败。 GUI 初始化线程中没有其他线程。而且主线程也没有访问GUI初始化线程的 Action 。

此时基本有两个线程:主线程和通过调用 invorkAndWait() 启动的 GUI 初始化线程。

最佳答案

如果您在 Event Dispatch Thread 之外的其他线程上执行 GUI 操作,这种情况在 Swing 中一直会发生。特别是“不可复制”是一个线索。这是一个计时问题,并发线程正在处理 GUI,而只有 EDT 应该这样做。参见 here获取更多信息。所以在 SwingUtilities.invokeLater 中包装 GUI 相关的东西,在你的情况下:

final FileFilter oldValue = fileFilter;
...
SwingUtilities.invokeLater(new Runnable() {
public void run() {
firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, oldValue, fileFilter);
}
});

关于java - 如何避免 JFileChooser.setFileFilter() 调用中的 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357978/

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