如何在用户所在的当前目录中打开JFileChooser?

时间:2014-02-18 04:11:10

标签: java swing directory jfilechooser working-directory

我不想指定目录。我只是想让它自动“知道”并在用户正在使用的目录中打开。我该怎么做?

4 个答案:

答案 0 :(得分:2)

基本上,你不能。你需要告诉它。

使用null currentDirectory(例如默认构造函数)构建时,它将使用FileSystemView#getDefaultDirectory

你可以为每个基本任务创建一个JFileChooser实例(一个用于保存,一个用于打开),只需维护该实例,它将“记住”它正在使用的最后一个目录,你仍然需要使用起始目录播种

另一个选择是构建某种类型的库调用,它可以加载并保存用户根据某个唯一键使用的最后一个目录。这意味着您可以简单地执行类似......

的操作
File toFile = MyAwesomeLibrary.getSaveFile(APPLICATION_DOCUMENT_SAVE_KEY);

哪个会加载提供的密钥的最后一个已知目录,并显示配置了该值的JFileChooser,并且如果用户取消了该Filenull,则能够返回操作...例如......

答案 1 :(得分:2)

此示例在首次显示时默认为user.dir。然后它按照MadProgrammer的建议保留选择器的实例以自动跟踪上次加载或保存位置。

enter image description here

enter image description here

enter image description here

enter image description here

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.io.*;

public class ChooserInCurrentDir {

    // the GUI as seen by the user (without frame)
    JPanel gui = new JPanel(new BorderLayout());
    JFileChooser fileChooser;
    private JTextArea output = new JTextArea(10, 40);

    ChooserInCurrentDir() {
        initComponents();
    }

    public final void initComponents() {
        gui.setBorder(new EmptyBorder(2, 3, 2, 3));

        String userDirLocation = System.getProperty("user.dir");
        File userDir = new File(userDirLocation);
        // default to user directory
        fileChooser = new JFileChooser(userDir);

        Action open = new AbstractAction("Open") {

            @Override
            public void actionPerformed(ActionEvent e) {
                int result = fileChooser.showOpenDialog(gui);
                if (result == JFileChooser.APPROVE_OPTION) {
                    try {
                        File f = fileChooser.getSelectedFile();
                        FileReader fr = new FileReader(f);
                        output.read(fr, f);
                        fr.close();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        };

        Action save = new AbstractAction("Save") {

            @Override
            public void actionPerformed(ActionEvent e) {
                int result = fileChooser.showSaveDialog(gui);
                throw new UnsupportedOperationException("Not supported yet.");
            }
        };

        JToolBar tb = new JToolBar();
        gui.add(tb, BorderLayout.PAGE_START);
        tb.add(open);
        tb.add(save);

        output.setWrapStyleWord(true);
        output.setLineWrap(true);

        gui.add(new JScrollPane(
                output,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
    }

    public final JComponent getGui() {
        return gui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                ChooserInCurrentDir cicd = new ChooserInCurrentDir();
                JFrame f = new JFrame("Chooser In Current Dir");
                f.add(cicd.getGui());
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See http://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

答案 2 :(得分:0)

如果要设置文件选择器上一次打开时所在的目录,则需要设置当前目录。

//This will set the directory to the directory they previously chose a file from.
fileChooser.setCurrentDirectory(fileChooser.getCurrentDirectory());

我不确定这是否是你要找的,但是当他们选择一个文件然后去选择另一个文件时,它会保留他们从之前的选择所在的目录。

答案 3 :(得分:0)

如果您希望应用程序查找用户的工作目录,可以尝试:

String curDir = System.getProperty("user.dir");