2016-08-26 35 views
0

我試圖打開一個JFileChooser對話框讓用戶決定他的願望目錄以進行下列操作。瞭解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是指向用戶的下載目錄的靜態字符串。

的行爲我不明白:

home_dir = C:/Users/Scy/Downloads 

按確定沒有選擇任何文件(或目錄)

Output: C:/Users/Scy 

home_dir = C:/Users/Scy/Downloads 

選擇中下載任何文件

Output: C:/Users/Scy/Downloads 

爲什麼我沒有選擇任何東西,而只是按下確定,沒有得到完整路徑(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" 

結果是完全一樣的上方。按下取消按鈕會導致完整路徑輸出,同時按下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,你設定的起始目錄不正確。注意你如何在第一個構造函數中傳遞一個選定的文件?這意味着在第二個構造函數中,'home_dir'將是選定的文件。如果您只想將'home_dir'設置爲起始目錄,則應該使用無參數構造函數並調用chooser.setCurrentDirector(new File(home_dir))。這裏是你的代碼可能會是什麼樣子的這段:

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中也沒有解釋它。 –