2016-08-26 6 views
0

JFileChooserダイアログを開いて、ユーザが次の操作のためのwish-directoryを決定できるようにしようとしています。JFileChooserの動作を理解する

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は、ユーザーのダウンロード・ディレクトリを指す静的な文字列です:

以下は、私の現在のコードです。

行動私は理解していない:OK

home_dir = C:/Users/Scy/Downloads 

押しをダウンロード内の任意のファイルを選択し

Output: C:/Users/Scy 

home_dir = C:/Users/Scy/Downloads 

任意のファイル(またはディレクトリ)を選択せず​​に

Output: C:/Users/Scy/Downloads 

何も選択せずに[OK]を押すとフルパス(C:/Users/Scy/Downloads)が出力されないのはなぜですか?

編集を(DIRECTORIES_ONLYがアクティブで、DIRECTORIES_ONLYなしで何も選択せずにOKを押すことはできません):私はちょうど私がちょうど何も選択せずに[キャンセル]ボタンを押したときの出力は、私は、C:/Users/Scy/Downloadsを期待確かにあることに気づきました。この記事への回答に基づいて

私は次のことを試してみました:

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

結果は上記と全く同じでした。キャンセルボタンを押すとフルパス出力、OK/Acceptを押すと結果はC:/Users/Scyとなります。

+0

"ダウンロード出力内の任意のファイルを選択:C:/ Users/Scy/Downloads"これは私があなたの質問で混乱しているところです。ディレクトリで**ファイル**を選択すると、 'getParentDirectory()'はそのディレクトリの名前を返すべきです。他に何を期待していますか?もっと重要なことは、あなたはどのような行動を望んでいるのですか? –

+0

'getParentDirectory()'はどこで使うのですか? 'getCurrentDirectory()'は、指定したファイルの親ディレクトリを返します。 C:/ Users/Scy/DownloadsはC:/ Users/Scyとなりますが、C:/ Users/Scy/Downloadsは現在のディレクトリであるはずです。 –

答えて

2

「選択されたファイル」(またはディレクトリ)が「現在のディレクトリ」(atmを取得しています)にあるのでしょうか?

現在選択されているファイルが必要な場合は、chooser.getSelectedFile()を探してください。 DirectoryOnlyモードに切り替えると、このメソッドはディレクトリ(たとえば、ディレクトリを表すFileインスタンス)を返します。

メソッドchooser.getCurrentDirectory()は、予期しない結果を説明する現在選択されているファイルの親ディレクトリを返します。 (getSelectedFile.getParentFile()が最も可能性が高い同じファイルを返します)


あなたがparentDirectoryを取得しようとしている場合、あなたは間違って開始ディレクトリを設定します。選択したファイルを最初のコンストラクタに渡す方法に注目してください。つまり、2番目のコンストラクタでは、 'home_dir'が選択されたファイルになります。 'home_dir'を開始ディレクトリとしてのみ設定する場合は、no-argsコンストラクタを使用して、代わりにchooser.setCurrentDirector(new File(home_dir))を呼び出す必要があります。ここにあなたのコードは次のように見えることができるもののsnippitです:

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

私はあなたが何を意味するのか本当に理解していません。 –

+0

@Meik Vtune質問を編集しましたが、現在は少しはっきりしているかもしれません – n247s

+0

開始時に述べたように、目標は現在のディレクトリを取得して保存することです。したがって、ユーザが 'E:/ Some/Dirs /'のようなディレクトリにいる場合、目的は 'E:/ Some'ではなく、そのパスを正確に取得することです。 –

1

getCurrentDirectory()ディレクトリ名前ではなく、ファイル名を返します。ユーザーがファイルを選択した場合、このメソッドはそのファイルを含むディレクトリの名前を返します。選択したファイルの名前が必要な場合は、getSelectedFile()を使用してください。まだお持ちでない場合は、this Oracle tutorial on file choosersとお読みください。

+0

最初の文章を読んでください。目標は選択したファイルを取得するのではなく、期待どおりに動作していないcurrentDirectoryを取得することです。 –

+0

@MeikVtune明確にしてください。何が起こっているのと違うと思いますか?作成されたファイル名とディレクトリ名で**具体的な例を挙げると助けになるかもしれません。 –

+0

質問はチャットで@ n247sによって返答されました。 'getCurrentDirectory()'は 'selectedFile.parentFile()'を使用しているように見えます。これは常に最後の部分を "切り捨て"また、JavaDocsのどこにも説明されていません。 –

関連する問題