2011-02-15 8 views
2

JFileChooser은 복수 파일을 선택할 수 있지만 동시에 선택할 수있는 파일 수에는 제한이 있습니다.이벤트에 대한 응답으로 JFileChooser에서 선택한 파일을 변경하십시오.

가장 최근에 선택한 파일에 우선 순위를 부여하여 실시간으로 선택을 제한하고 싶습니다. 즉, 세 번째 파일을 선택하면 첫 번째 파일 (즉, 가장 먼저 선택한 파일)이 있어야합니다. 자동으로 선택 취소됩니다.

나는이 하나 같이 PropertyChangeListener이 작동 것이라고 생각 : fc.setSelectedFiles()에 대한 호출이 (.이 이벤트를 발생하지만, 그것은 목록에서 선택을 업데이트하지 않습니다)

효과가 없습니다 그러나

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

JFileChooser이 열려있는 동안 프로그래밍 방식으로 선택 항목을 변경하도록 할 방법이 있습니까? 또는 선택 영역의 크기를 제한하는 또 다른 방법이 있습니까?

답변

0

이 버그는 Macintosh의 모양과 느낌에 특정하다는 것을 발견했습니다. setSelectedFilesetSelectedFiles은 Mac에서 (대화 상자가 열리기 전에도) 전혀 작동하지 않습니다. 내 샘플 코드는 Metal Look-and-Feel으로 잘 작동합니다.

가능한 해결 방법은 다음과 같습니다 :

  • 다른 모양과 느낌
  • 사용 대신 JFileChooserFileDialog를 사용 (여러 파일 선택을 지원하지 않습니다)
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

간단한 구현을 해줘서 고맙지 만 문제가 해결되지는 않습니다. 내 버전과 마찬가지로, 그것은 메탈이나 윈도우의 룩앤필로 작동하지만 매킨토시에서는 작동하지 않습니다. – finnw

+0

좋아, 나는 당신의 버전에 문제가있어서 문제라고 생각했다. 저는 Mac이 없으므로 당신을 도울 수 없습니다. 행운을 빕니다 ;) –

관련 문제