使用JFileChooser设置默认保存扩展名

Sai*_*ike 14 java swing jfilechooser save

我正在尝试使用保存文件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());
        }

    }
Run Code Online (Sandbox Code Playgroud)

这不会强制文件具有.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);
Run Code Online (Sandbox Code Playgroud)

然而,这个我无法阻止写入用户xpto.xmlJFileChooser,如果他们这样做,该文件将有"两个扩展":这将是一个文件名为xpto.xml.xml

所以我的问题是:

  • 如何JFileChooser默认保存xml文件?
  • 如果用户插入了像xpto.xml这样的文件名,我该如何将其保存为xpto.xml而不是xpto.xml.xml?

Nat*_*rot 19

正如您所注意到的,JFileChooser不执行FileFilter保存.它会使显示的对话框中的现有非XML文件变灰,但就是这样.要强制执行文件名,您必须完成所有工作.(这不仅仅是JFileChooser吮吸的问题 - 处理这是一个复杂的问题.您可能希望您的用户能够命名他们的文件xml.xml.xml.xml.)

在您的情况下,我建议使用FilenameUtilsCommons 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"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是JFileChooser的问题。除非您在下拉菜单中选择“所有文件”,否则大多数UI都会自动添加扩展名,在这种情况下,它将不理会其扩展名。这就是JFileChooser应该做的,这就是我想在我的应用程序中复制的行为(因为这是人们所熟悉的)。我想如果不深入JFileChooser的内部,这是不可能的吗? (2认同)
  • 您需要为您想要的行为实现自己的文件选择器。不过,您所描述的并不是任何类型的标准,当我写出文件扩展名然后程序添加自己的扩展名时,我感到非常恼火(然后操作系统隐藏了它,我有一个文件神秘地损坏了,因为某些开发人员以为他们在帮忙)。 (2认同)

Dia*_*ake 11

只是为了明确如何使用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"));
Run Code Online (Sandbox Code Playgroud)

现在,鼓励用户在此示例中将项目另存为xml文件,但实际上可能没有设置它.

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

   //DO something with filename

 }
Run Code Online (Sandbox Code Playgroud)

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