2016-08-01 40 views
0

Ich verwende System.setProperty("apple.awt.fileDialogForDirectories", "true");, um nur Ordner auszuwählen. Wenn ich new java.io.File(fd.getFile()).getAbsolutePath(); ausführe, gibt es immer /Users/<user>/Desktop/<folder> zurück. Sagen wir/Benutzer, es wird /Users/<user>/Desktop/Users zurückgegeben. Wie kann ich es reparieren?Java filialialog immer vor/Benutzer/<user>/Desktop in Mac

Code:

if (System.getProperty("os.name").toLowerCase().contains("mac")) { 
     System.setProperty("apple.awt.fileDialogForDirectories", "true"); 

     FileDialog fd = new FileDialog(this, "Choose a folder to save streams", FileDialog.LOAD); 
     fd.setDirectory(saveStreamLocTB.getText()); 

     fd.setVisible(true); 

     String loc = new java.io.File(fd.getFile()).getAbsolutePath(); 
     if (loc != null) { 
      p.setSaveStreamLoc(loc); 
      saveStreamLocTB.setText(loc); 
     } 

     System.setProperty("apple.awt.fileDialogForDirectories", "false"); 
    } 

bearbeiten Ich brauche den vollständigen Pfad

+0

Warum benutzen Sie 'apple.awt'? Java bietet einen [plattformübergreifenden Dateiauswahldialog] (https://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html), der einfach so konfiguriert werden kann, dass nur Ordner ausgewählt werden. – dimo414

+0

Wenn Sie keinen absoluten Pfad möchten, warum verwenden Sie 'getAbsolutePath()'? – EJP

Antwort

0

ich es!

Diese

String loc = new java.io.File(fd.getFile()).getAbsolutePath(); 

erforderlich sein, diese

String loc = fd.getDirectory() + fd.getFile(); 
1

fd.getFile() einen relativen Pfad zurückgibt, und new File() wird eine neue Filerelativ zum Ausführungsverzeichnis erstellen:

Standardmäßig sind die Klassen in th Das java.io Paket löst immer relative Pfadnamen für das aktuelle Benutzerverzeichnis auf. Dieses Verzeichnis wird von der Systemeigenschaft user.dir benannt und ist normalerweise das Verzeichnis, in dem die Java Virtual Machine aufgerufen wurde.

Wenn Sie also .getAbsolutePath() anrufen, ist der Pfad, mit dem Sie arbeiten, bereits verstümmelt.

Aufruf fd.getDirectory() + fd.getFile() funktioniert, aber Sie sollten mit String-Verkettung konstruieren Dateipfade vermeiden - das ist, was die two-argument File constructor für ist, so stattdessen tun:

String loc = new File(fd.getDirectory(), fd.getFile()).getAbsolutePath(); 

Das heißt Java 7 führte die viel flexibler und leistungsstarke Path Klasse, und wo immer möglich würde ich vorschlagen, über File zu verwenden. In derselben Richtung enthält Swing eine cross-platform file-chooser dialog, mit der man viel leichter arbeiten kann als Apples alte awt APIs. Es gibt auch DirectoryChooser, wenn Sie JavaFX ausprobieren möchten.