我希望我的JFileChooser
允许多个文件选择,但是可以同时选择的文件数量有限制。
理想情况下,我想实时约束选择,优先考虑最近选择的文件,即当选择第3个文件时,应取消选择第1个文件(即最早选择的文件)自动。
我认为像这样的PropertyChangeListener
会起作用:
public static void main(String[] args) throws IOException {
final JFileChooser fc = new JFileChooser(didir);
fc.setMultiSelectionEnabled(true);
fc.addPropertyChangeListener(new PropertyChangeListener() {
private final Set<File> selected = Sets.newLinkedHashSet();
public void propertyChange(PropertyChangeEvent evt) {
if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(evt.getPropertyName())) {
File[] selectedFiles = fc.getSelectedFiles();
if (selectedFiles.length > 2) {
selected.addAll(Arrays.asList(selectedFiles));
int numToRemove = Math.max(0, selected.size() - 2);
Iterables.removeIf(Iterables.limit(selected, numToRemove),
Predicates.alwaysTrue());
fc.setSelectedFiles(selected.toArray(new File[0]));
}
}
}
});
fc.showOpenDialog(null);
}
然而,对fc.setSelectedFiles()
的调用无效(虽然它会触发事件,但它不会更新列表中的选择。)
在JFileChooser
打开时,有没有办法以编程方式强制更改选择?或者是否有其他方法来限制选择的大小?
答案 0 :(得分:0)
我发现这个bug特定于Macintosh的外观。 setSelectedFile
和setSelectedFiles
在Mac上根本不起作用(甚至在对话框打开之前。)我的示例代码可以正常使用Metal外观。
可能的解决方法包括:
FileDialog
代替JFileChooser
答案 1 :(得分:0)
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JFileChooser;
public class MyClass {
final static JFileChooser fc = new JFileChooser("/");
public static void main(String[] args) throws IOException {
fc.setMultiSelectionEnabled(true);
fc.addPropertyChangeListener(new ChangeListener());
fc.showOpenDialog(null);
}
private static class ChangeListener implements PropertyChangeListener{
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(evt.getPropertyName())) {
File[] selectedFiles = fc.getSelectedFiles();
File[] allowedFiles = new File[2];
if (selectedFiles.length > 2) {
allowedFiles[0] = selectedFiles[1];
allowedFiles[1] = selectedFiles[0];
fc.setSelectedFiles(allowedFiles);
}
}
}
}
}