了解JFileChooser行为

时间:2016-08-26 22:37:02

标签: java 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是一个指向用户Download-directory的静态String。

我不明白的行为:

home_dir = C:/Users/Scy/Downloads

按OK而不选择任何文件(或目录)

Output: C:/Users/Scy
home_dir = C:/Users/Scy/Downloads

选择下载

中的任何文件
Output: C:/Users/Scy/Downloads

为什么在没有选择任何内容而只是按OK时我没有得到全路径(C:/Users/Scy/Downloads)作为输出? (激活DIRECTORIES_ONLY后,如果没有DIRECTORIES_ONLY选择任何内容,则无法按“确定”

编辑:我刚注意到,当我只是按下取消按钮而没有选择任何内容时,输出确实是我所期望的,C:/Users/Scy/Downloads

根据这篇文章的回答,我尝试了以下内容:

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

结果与上面完全相同。按“取消”按钮将导致完整路径输出,而按“确定/接受”将导致C:/Users/Scy

2 个答案:

答案 0 :(得分:2)

也许“选定文件”(或目录)位于“当前目录”(您正在检索atm。)?

如果您想要当前选定的文件,chooser.getSelectedFile()就是您要找的。请记住,当切换到DirectoryOnly模式时,此方法将返回一个目录(例如,表示目录的File实例)。

方法chooser.getCurrentDirectory()将返回当前所选文件的父目录,该目录解释了意外结果。 (getSelectedFile.getParentFile()很可能会返回相同的文件)


如果您尝试检索parentDirectory,则设置起始目录不正确。请注意如何在第一个构造函数中传递选定的文件?这意味着在第二个构造函数中,'home_dir'将是所选的文件。如果您只想将'home_dir'设置为起始目录,则应使用no-args构造函数并调用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));
}

答案 1 :(得分:1)

getCurrentDirectory()会返回目录名称,而不是文件名。如果用户选择文件,则此方法返回包含该文件的目录的名称。如果您想要选择的文件名,则应使用getSelectedFile()。如果您还没有,请阅读this Oracle tutorial on file choosers