2010-05-21 12 views
16

Ich habe das Gefühl, dass es eine einfache Möglichkeit geben sollte, dies zu tun, aber ich kann es nicht herausfinden. Ich habe einen JFileChooser, der dem Benutzer erlaubt, Verzeichnisse zu wählen. Ich möchte alle Dateien in den Verzeichnissen anzeigen, um dem Benutzer einen Kontext zu geben, aber nur Verzeichnisse sollten als Auswahl akzeptiert werden (vielleicht wäre die Schaltfläche Öffnen bei der Auswahl einer Datei deaktiviert). Gibt es eine einfache Möglichkeit, dies zu tun?JFileChooser Verzeichnis auswählen, aber Dateien anzeigen

Antwort

12

Überschreiben Sie die approveSelection() -Methode. Etwas wie:

JFileChooser chooser = new JFileChooser(new File(".")) 
{ 
    public void approveSelection() 
    { 
     if (getSelectedFile().isFile()) 
     { 
      // beep 
      return; 
     } 
     else 
      super.approveSelection(); 
    } 
}; 
1

AFAIK JFileChooser trennt Dateifilterung (was angezeigt werden kann, sehr konfigurierbar) von Auswahlfilterung (was ausgewählt werden kann).

Die Konfiguration der Auswahl Filterung ist wesentlich eingeschränkt, aber AFAIK können Sie nur Verzeichnisse oder Dateien nur erlauben, wählen mit setFileSelectionMode()

-1

ausgewählt werden Ich denke, die beste Lösung nur, damit der Benutzer entweder eine wählen Datei oder ein Verzeichnis. Und wenn der Benutzer eine Datei auswählt, verwenden Sie einfach das Verzeichnis, in dem sich diese Datei befindet.

+0

eher schlecht UX. –

13

Siehe setFileSelectionMode() in How to Use File Choosers:

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 

Nachtrag: Der Effekt kann durch Auskommentierung Linie 73 dieser FileChooserDemo sehen werden, aber es scheint, plattformabhängig zu sein.

Nachtrag: Wenn FILES_AND_DIRECTORIES verwenden, sollten Sie entsprechend den Button Text ändern:

chooser.setApproveButtonText("Choose directory"); 

Da die Wirkung ist L & F abhängig, betrachten DIRECTORIES_ONLY auf Plattformen, die bereits Ihre UI Anforderungen erfüllen:

if (System.getProperty("os.name").startsWith("Mac OS X")) { 
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
} else { 
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
} 
+0

Aber das wird Dateien verstecken, was er nicht will. –

+0

@mmyers: Es zeigt die Dateien in grau in dem oben genannten Beispiel. YMMV – trashgod

+0

Von dem, was das Tutorial sagt, es scheint, dass es laf-abhängig ist. –

17

Meine Lösung ist eine Zusammenführung zwischen den Antworten von camickr und trashgod:

final JFileChooser chooser = new JFileChooser() { 
      public void approveSelection() { 
       if (getSelectedFile().isFile()) { 
        return; 
       } else 
        super.approveSelection(); 
      } 
    }; 
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
+1

+1 Sieht aus als wäre ich in guter Gesellschaft! Ich habe meine Antwort aktualisiert, um diesen kombinierten Ansatz widerzuspiegeln. – trashgod

+1

Sehr gut! 'JFileChooser.FILES_AND_DIRECTORIES' ist ** wichtig **! Ohne sie ist (wie in Camickrs Antwort) die Lösung ** nutzlos **, wie ich getestet habe. –

2

Die Lösung des Überschreibens approveSelection kann für bestimmte Benutzer lästig sein.

Manchmal klickt ein Benutzer ohne Grund auf eine Datei in einem Verzeichnis (obwohl sie das Verzeichnis und nicht die Datei auswählen möchte). Wenn das passiert, wäre der Benutzer (Art-a) in der JFileChooser fest, wie die approveSelection wird fehlschlagen, auch wenn sie die Datei abwählen. Um diesen Ärger zu vermeiden, das ist, was ich tue:

JFileChooser fileChooser = new JFileChooser(); 

fileChooser.setFileSelectionMode(
     JFileChooser.FILES_AND_DIRECTORIES); 

int option = fileChooser.showDialog(null, 
     "Select Directory"); 

if (option == JFileChooser.APPROVE_OPTION) { 
    File f = fileChooser.getSelectedFile(); 
    // if the user accidently click a file, then select the parent directory. 
    if (!f.isDirectory()) { 
     f = f.getParentFile(); 
    } 
    System.out.println("Selected directory for import " + f); 
} 

das Verzeichnis auswählen, auch wenn der Benutzer eine Datei führt zu einer besseren Bedienbarkeit meiner Meinung nach ausgewählt.

0

Halten Sie die fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) und Verwendung:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles(); 
Verwandte Themen