2016-08-01 11 views
0

の前に置いています。私はSystem.setProperty("apple.awt.fileDialogForDirectories", "true");を使ってフォルダを選択しています。 new java.io.File(fd.getFile()).getAbsolutePath();を実行すると、常に/Users/<user>/Desktop/<folder>が返されます。/usersを選択すると、/Users/<user>/Desktop/Usersが返されます。どうすれば修正できますか?Javaのfiledialogは常に/ Users/<user>/Macのデスクトップを

コード:

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

編集は、私はそれを得た

+0

なぜ 'apple.awt'を使用していますか? Javaには、フォルダを選択するように簡単に設定できる[クロスプラットフォームのファイル選択ダイアログ(https://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html)]が用意されています。 – dimo414

+0

絶対パスが必要ない場合、なぜあなたは 'getAbsolutePath()'を使用していますか? – EJP

答えて

0

フルパスを必要とします!この

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

fd.getFile()にする必要

この

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

相対パスを返し、new File()は実行ディレクトリに新しいFile相対を作成します。

デフォルトでは、 e java.ioパッケージは常に現在のユーザーディレクトリに対して相対パス名を解決します。このディレクトリはシステムプロパティuser.dirによって名前が付けられ、通常Java仮想マシンが呼び出されたディレクトリです。

.getAbsolutePath()に電話をかけるときまでに、作業しているパスは既にマングリングされています。

fd.getDirectory() + fd.getFile()作品を呼び出していますが、文字列の連結にファイルパスを構築することは避けてください - それはtwo-argument File constructorが何のためにあるのかなので、代わりに実行します。

String loc = new File(fd.getDirectory(), fd.getFile()).getAbsolutePath(); 
のJava 7と

が導入はるかに柔軟かつ強力なPathクラス、可能であれば私はそれをFile以上に使うことをお勧めします。同じ行に沿って、SwingにはAppleの古いawt APIよりもはるかに扱いやすいcross-platform file-chooser dialogが含まれています。 JavaFXを試したい場合はDirectoryChooserもあります。

関連する問題