2016-08-26 3 views
0

Ich versuche, einen JFileChooser Dialog zu öffnen, um den Benutzer sein Wunschverzeichnis für die folgenden Operationen entscheiden zu lassen.JFileChooser-Verhalten verstehen

Folgende ist mein aktueller Code:

JFileChooser chooser; 
if(pref.get("LAST_PATH", "") != null){ 
    chooser = new JFileChooser(pref.get("LAST_PATH", "")); 
} else{ 
    chooser = new JFileChooser(home_dir); 
} 
//chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
chooser.setAcceptAllFileFilterUsed(false); 
int retVal = chooser.showOpenDialog(frame); 
System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory().toString()); 

home_dir ein statischer String ist herunterladen-Verzeichnis für die Benutzer zeigen.

Das Verhalten Ich verstehe nicht:

home_dir = C:/Users/Scy/Downloads 

Drücken Sie OK, ohne eine Datei auswählen (oder das Verzeichnis)

Output: C:/Users/Scy 

home_dir = C:/Users/Scy/Downloads 

Auswahl einer beliebigen Datei innerhalb Downloads

Output: C:/Users/Scy/Downloads 

Warum erhalte ich nicht den vollständigen Pfad (C:/Users/Scy/Downloads) als Ausgabe, wenn ich nichts auswähle und nur OK drücke? (Mit DIRECTORIES_ONLY aktiviert, kann nicht OK drücken, ohne eine Auswahl ohne DIRECTORIES_ONLY)

Edit: Ich habe gerade bemerkt, dass, wenn ich drücken Sie einfach auf die Schaltfläche Abbrechen, ohne eine Auswahl der Ausgang in der Tat ist das, was ich erwarte, C:/Users/Scy/Downloads.

Auf der Grundlage einer Antwort auf diesen Beitrag habe ich versucht, die folgenden:

JFileChooser chooser = new JFileChooser(); 
chooser.setCurrentDirectory(new File(home_dir)); //home_dir = "C:/Users/Scy/Downloads" 

Das Ergebnis war genau das gleiche wie oben. Wenn Sie auf die Schaltfläche Abbrechen klicken, wird die vollständige Pfadausgabe angezeigt, während OK/Übernehmen die Ergebnisse in C:/Users/Scy anzeigt.

+0

"Wählen Sie eine beliebige Datei in Downloads Ausgabe: C:/Benutzer/Scy/Downloads" Hier ist ich durch Ihre Frage verwirrt. Wenn Sie eine ** Datei ** in einem Verzeichnis auswählen, sollte 'getParentDirectory()' den Namen dieses Verzeichnisses zurückgeben. Was erwartest du sonst noch? Noch wichtiger, welches Verhalten willst du **? –

+0

Wo verwende ich 'getParentDirectory()'? 'getCurrentDirectory()' gibt das übergeordnete Verzeichnis jeder Datei zurück, die ich hineingelegt habe. Wenn Sie also ein Verzeichnis oder genauer gesagt "C:/Users/Scy/Downloads" auswählen, wird "C:/Users/Scy" angezeigt, während "C:/Users/Scy/Downloads" angezeigt werden muss, da dies das aktuelle Verzeichnis ist. –

Antwort

2

Vielleicht befindet sich die 'ausgewählte Datei' (oder das Verzeichnis) im 'aktuellen Verzeichnis' (das Sie gerade herunterladen).

Wenn Sie die aktuelle ausgewählte Datei möchten, ist chooser.getSelectedFile(), was Sie suchen. Beachten Sie, dass diese Methode beim Wechseln in den DirectoryOnly-Modus ein Verzeichnis zurückgibt (z. B. eine Dateiinstanz, die ein Verzeichnis darstellt).

Die Methode chooser.getCurrentDirectory() gibt das übergeordnete Verzeichnis der aktuell ausgewählten Datei zurück, das die unerwarteten Ergebnisse erklärt. (getSelectedFile.getParentFile() wird höchstwahrscheinlich die gleiche Datei zurück)


Wenn Sie versuchen, die Parent abzurufen, setzen Sie das Startverzeichnis nicht korrekt. Beachten Sie, wie Sie dem ersten Konstruktor eine ausgewählte Datei übergeben? Das heißt, im zweiten Konstruktor wird 'home_dir' die ausgewählte Datei sein. Wenn Sie 'home_dir' nur als Startverzeichnis festlegen möchten, sollten Sie stattdessen den Konstruktor no-args verwenden und stattdessen aufrufen. Hier ist ein snippit von dem, was Ihr Code aussehen könnte:

JFileChooser chooser; 
if(pref.get("LAST_PATH", "") != null){ 
    // set last SELECTED file/directory path. 
    chooser = new JFileChooser(pref.get("LAST_PATH", "")); 
} else{ 
    // set currentDirectory, but dont select anything yet. 
    chooser = new JFileChooser(); 
    chooser.setCurrentDirectory(new File(home_dir)); 
} 
+0

Ich verstehe nicht wirklich was du meinst. –

+0

@Meik Vtune Bearbeitet die Frage, könnte jetzt ein bisschen klarer sein – n247s

+0

Wie gesagt, am Anfang ist das Ziel, das aktuelle Verzeichnis zu bekommen und das zu speichern. Wenn sich der Benutzer in einem Verzeichnis wie 'E:/Some/Dirs /' befindet, ist es das Ziel, genau diesen Pfad zu bekommen, nicht 'E:/Some'. –

1

getCurrentDirectory() gibt einen Verzeichnis Namen, keine Dateinamen. Wenn der Benutzer eine Datei auswählt, gibt diese Methode den Namen des Verzeichnisses zurück, das diese Datei enthält. Wenn Sie den Namen der Datei, die ausgewählt wurde, möchten, sollten Sie getSelectedFile() verwenden.Wenn Sie noch nicht haben, sollten Sie this Oracle tutorial on file choosers lesen.

+0

Sie sollten den ersten Satz lesen, mein Ziel ist es NICHT, die ausgewählte Datei zu erhalten, sondern das currentDirectory zu bekommen, das nicht wie erwartet funktioniert. –

+0

@MeikVtune Bitte klären. Was erwarten Sie, dass das anders ist als was passiert? Es kann hilfreich sein, wenn Sie ein ** spezifisches ** Beispiel mit erfundenen Datei- und Verzeichnisnamen angeben. –

+0

Die Frage wurde von @ n247s im Chat beantwortet, 'getCurrentDirectory()' scheint 'selectedFile.parentFile()' zu verwenden, was immer dazu führt, dass der letzte Teil abgeschnitten wird, was ich nicht erwartete, und es wird auch nirgendwo in den JavaDocs erklärt. –