【问题标题】:Set default saving extension with JFileChooser使用 JFileChooser 设置默认保存扩展名
【发布时间】:2013-06-05 07:51: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);

但是,我不能阻止用户在JFileChooser 中写入xpto.xml,如果他们这样做,该文件将具有“两个扩展名”:它将是一个名为xpto.xml.xml 的文件

所以我的问题是:

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

【问题讨论】:

  • 我只是想知道如果用户给出像something.xml.xml.xml 这样的名称,程序应该如何反应。
  • 放 ` + ".xml"` 的唯一问题是,如果您重新打开该文件,那么它将是 fileName.xml.xml

标签: java swing save jfilechooser


【解决方案1】:

如您所见,JFileChooser 不会在保存时强制使用FileFilter。它将在它显示的对话框中灰显现有的非 XML 文件,但仅此而已。要强制执行文件名,您必须完成所有工作。 (这不仅仅是 JFileChooser 糟糕的问题 - 这是一个需要处理的复杂问题。您可能希望您的用户能够将他们的文件命名为 xml.xml.xml.xml。)

在你的情况下,我建议使用来自 Commons IO 的FilenameUtils

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"
}

如果您想在保存对话框中使用多种类型,这里还有一些建议:How to save file using JFileChooser?

【讨论】:

  • 我认为 JFileChooser 很烂。大多数 UI 会自动添加扩展名,除非您在下拉菜单中选择“所有文件”,在这种情况下,它将不理会它们的扩展名。这是 JFileChooser 应该做的,这是我想在我的应用程序中复制的行为(因为它是人们熟悉的)。如果不深入了解 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
}

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

【讨论】:

    【解决方案3】:

    这样的事情怎么样:

        else if (e.getSource() == saveMenu) {
            int returnVal = chooser.showSaveDialog(Simulator.this);
    
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = chooser.getSelectedFile();
    
                String fname = file.getAbsolutePath();
    
                if(!fname.endsWith(".xml") ) {
                    file = new File(fname + ".xml");
    
                if(!file.createNewFile()) {
                    /*check with user??*/
                }
    

    【讨论】:

    • 如果要替换当前文件扩展名,只需在file = new File(fname + ".xml");前添加fname = fname.substring(0, fname.lastIndexOf('.'));
    【解决方案4】:

    你应该试试这个:

    if(!file.getName().contains(".")) file = new File(file.toString() + ".xml");
    

    【讨论】:

      【解决方案5】:

      你应该试试这个。我这样做了,它奏效了。

      FileOutputStream fileOut =  new FileOutputStream(file1+".xml");
      hwb.write(fileOut);
      fileOut.close();
      System.out.println("\n Your file has been generated!");
      JOptionPane.showMessageDialog(this,"File Created.");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多