2011-02-15 42 views
2

我希望我的JFileChooser允许多个文件选择,但限制可同时选择的文件数。更改JFileChooser中的选定文件以响应事件

理想情况下,我想实时约束选择,优先考虑最近选择的文件,即当选择第三个文件时,第一个文件(即最早选择的文件)应该是自动取消选择。

我认为一个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

我发现这个错误是特定于Macintosh的外观和感觉。 setSelectedFilesetSelectedFiles根本无法在Mac上工作(甚至在打开对话框之前)。我的示例代码在Metal外观上工作良好。

可能的解决方法包括:

  • 使用不同的外观和感觉
  • 使用FileDialog而不是JFileChooser(不支持多文件选择)
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); 
       } 
      } 
     } 
    } 
} 
+0

感谢更简单的实现,但这不能解决问题。像我的版本一样,它适用于Metal或Windows外观,但不适用于Macintosh。 – finnw 2011-02-15 13:33:34