使用 JFileChooser 设置默认保存扩展

2022-09-02 23:49:48

我正在尝试使用 保存文件。但是,我似乎遇到了一些麻烦。这是我的代码:JFileChooser

    if (e.getSource() == saveMenu) {

        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        FileNameExtensionFilter xmlFilter = new FileNameExtensionFilter("xml files (*.xml)", "xml");
        // add filters
        chooser.addChoosableFileFilter(xmlFilter);
        chooser.setFileFilter(xmlFilter);

        int result = chooser.showSaveDialog(Simulation.this);

        if (result == chooser.APPROVE_OPTION) {
            writeToXML(chooser.getSelectedFile());
        }

    }

这不会强制文件具有扩展名,因此我尝试使用以下代码强制使用扩展名保存文件.xml.xml

     OutputFormat format = OutputFormat.createPrettyPrint();
     format.setEncoding("UTF-8");
     XMLWriter xmlWriter = null;
     try {              
         xmlWriter = new XMLWriter(new OutputStreamWriter(
                 new FileOutputStream(f+".xml"), "UTF8"),
                 format);

但是,有了这个,我无法阻止用户写入,如果他们这样做,该文件将具有“两个扩展名”:它将是一个名为xpto.xmlJFileChooserxpto.xml.xml

所以我的问题是:

  • 如何使保存默认为xml文件?JFileChooser
  • 如果用户插入了一个文件名,如xpto.xml,我如何将其保存为xpto.xml而不是xpto.xml.xml?

答案 1

正如你所注意到的,不会在保存时强制执行。它将在其显示的对话框中将现有的非 XML 文件灰显,但仅此而已。要强制执行文件名,您必须完成所有工作。(这不仅仅是JFileChooser吸吮的问题 - 这是一个需要处理的复杂问题。您可能希望您的用户能够命名其文件。JFileChooserFileFilterxml.xml.xml.xml

在你的情况下,我建议使用来自共享资源IO的文件名:

File file = chooser.getSelectedFile();
if (FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("xml")) {
    // filename is OK as-is
} else {
    file = new File(file.toString() + ".xml");  // append .xml if "foo.jpg.xml" is OK
    file = new File(file.getParentFile(), FilenameUtils.getBaseName(file.getName())+".xml"); // ALTERNATIVELY: remove the extension (if any) and replace it with ".xml"
}

如果你想在这里的保存对话框中使用多种类型,还有一些想法:如何使用JFileChooser保存文件?


答案 2

只是为了弄清楚如何使用JFileChooser来保存文件。

//set it to be a save dialog
 chooser.setDialogType(JFileChooser.SAVE_DIALOG);
//set a default filename (this is where you default extension first comes in)
 chooser.setSelectedFile(new File("myfile.xml"));
//Set an extension filter, so the user sees other XML files
 chooser.setFileFilter(new FileNameExtensionFilter("xml file","xml"));

现在,在此示例中,鼓励用户将项目另存为 xml 文件,但他们可能尚未实际设置它。

if(chooser.showSaveDialog(this) == jFileChooser.APPROVE_OPTION) {
    String filename = chooser.getSelectedFile().toString();
    if (!filename .endsWith(".xml"))
        filename += ".xml";

    //DO something with filename
}

这是最简单的情况,如果您有多种可能的文件格式,那么您应该捕获选定的过滤器,验证该扩展名,并根据所选格式保存文件。但是如果你这样做,你可能是一个高级Java程序员,而不是利用这篇文章。