java - 如何使用 JFileChooser 将文件保存到选定的目录

标签 java swing jfilechooser

我是 Java 的新手,所以请多多包涵。

在我的程序中,我想让用户能够将文件保存到他们选择的目录中。在做了一些研究之后,我发现了这个名为 JFileChooser 的漂亮类。我想要做的是允许用户通过 JFileChooser GUI 转到他们想要的目录,为他们的文件键入一个名称,并允许他们将他们的文件保存到想要的目录。我尝试在网上寻找如何执行此操作的解决方案,但几乎在我阅读的所有地方,最终答案都是“现在你必须让你的程序保存文件”,我不知道该怎么做。有人可以提供一些评论良好的虚拟代码来完成上述描述吗?另外,有谁知道 JFileChooser 是否提供“新建文件夹”选项?

提前致谢。

最佳答案

将所有部分放在一起并非易事。您需要一个 FileFilter 来保存到特定的扩展名。

这是我的一个 Swing 应用程序的示例。

protected static final String EXTENSION = ".png";

protected static final String FORMAT_NAME = "png";

protected static final LayoutFileFilter SAVE_AS_IMAGE = 
        new LayoutFileFilter("PNG Image Format", EXTENSION, true);

protected int chooseSaveFile(BufferedImage image) {
    JFileChooser fileChooser = new JFileChooser();
    ExtensionFileFilter pFilter = new ExtensionFileFilter(SAVE_AS_IMAGE);
    fileChooser.setFileFilter(pFilter);
    int status = fileChooser.showSaveDialog(frame.getFrame());

    if (status == JFileChooser.APPROVE_OPTION) {
        File selectedFile = fileChooser.getSelectedFile();

        try {
            String fileName = selectedFile.getCanonicalPath();
            if (!fileName.endsWith(EXTENSION)) {
                selectedFile = new File(fileName + EXTENSION);
            }
            ImageIO.write(image, FORMAT_NAME, selectedFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return status;
}

您会注意到该方法中有代码确保将 EXTENSION 追加到文件名的末尾,除非 EXTENSION 已经存在。这是 Java 等效项中缺少的标准 Windows 行为。

为了保存特定的扩展名,您需要一个 FileFilter。

import java.io.File;

import javax.swing.filechooser.FileFilter;

public class ExtensionFileFilter extends FileFilter {

    protected LayoutFileFilter filter;

    protected String description;
    protected String[] extensions;

    public ExtensionFileFilter(LayoutFileFilter filter) {
        this(filter.getDescription(), filter.getExtension());
        this.filter = filter;
    }

    public ExtensionFileFilter(String description, String extension) {
        this(description, new String[] {extension});
    }

    public ExtensionFileFilter(String description, String[] extensions) {
        if ((description == null) || (description.equals(""))) {
            this.description = extensions[0] + " {" + extensions.length + "}";
        } else {
            this.description = description;
        }
        this.extensions = (String[]) extensions.clone();
        toLower(this.extensions);
    }

    private void toLower(String[] extensions) {
        for (int i = 0, n = extensions.length; i < n; i++) {
            extensions[i].toLowerCase();
        }
    }

    @Override
    public boolean accept(File file) {
        if (file.isDirectory()) {
            return true;
        } else {
            String path = file.getAbsolutePath().toLowerCase();
            for (int i = 0, n = extensions.length; i < n; i++) {
                String extension = extensions[i];
                if (path.endsWith(extension)) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public String getDescription() {
        return description;
    }

    public LayoutFileFilter getLayoutFileFilter() {
        return filter;
    }

}

最后,LayoutFileFilter。

public class LayoutFileFilter {

    boolean isDefault;

    String description;
    String extension;

    public LayoutFileFilter() {

    }

    public LayoutFileFilter(String description, String extension,
            boolean isDefault) {
        this.description = description;
        this.extension = extension;
        this.isDefault = isDefault;
    }

    public boolean isDefault() {
        return isDefault;
    }

    public void setDefault(boolean isDefault) {
        this.isDefault = isDefault;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getExtension() {
        return extension;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

}

关于java - 如何使用 JFileChooser 将文件保存到选定的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13920501/

相关文章:

java - 使用 EJB 注入(inject)用户实体

java - JMenuItem 快捷键 Ctrl-C/Ctrl-V 或 Ctrl-Insert/Shift-Insert 不再起作用

java - 我从 MySql 收到异常,它不会更新表?

java - Android Webview 输入文件选择器代码错误

java - 在没有比较的情况下使用集合引用作为 if 语句条件?

java - 无法在 android 中的服务器 mysqli/Php 上发布数据

java - java Swing 中的锚定和停靠控件

java - JFileChooser 无法与 Servlet 一起使用?

java - 使用 JFileChooser 打开文件、读取文件并设置值

java - 通过对 apply 进行相应的函数调用来反射(reflect)一组更改