【问题标题】:How to save file using JFileChooser?如何使用 JFileChooser 保存文件?
【发布时间】:2011-02-01 15:04:57
【问题描述】:

我的应用程序中有一个名为“另存为”的方法,它将我的应用程序在计算机上的图像保存到文件中。 我使用 JFileChooser 让用户选择他们想要的位置来保存文件。 问题是除非用户明确键入文件格式,否则它会保存没有扩展名的文件。 如何在“文件类型”下拉菜单中设置 jpg、png 等格式。

以及,如何从文件类型下拉菜单中获取扩展名以保存我的图像文件。

 ImageIO.write(image,extension,file);

【问题讨论】:

    标签: java swing bufferedimage jfilechooser filefilter


    【解决方案1】:

    终于解决了我自己的问题:

    JFileChooser fc = new JFileChooser("C:/");
    fc.addChoosableFileFilter(new JPGSaveFilter());
    fc.addChoosableFileFilter(new JPEGSaveFilter());
    fc.addChoosableFileFilter(new PNGSaveFilter());
    fc.addChoosableFileFilter(new GIFSaveFilter());
    fc.addChoosableFileFilter(new BMPSaveFilter());
    fc.addChoosableFileFilter(new WBMPSaveFilter()); 
    
    int retrieval = fc.showSaveDialog(null);
    
    if (retrieval == JFileChooser.APPROVE_OPTION) {
      String ext = "";
    
      String extension = fc.getFileFilter().getDescription();
    
      if (extension.equals("*.jpg,*.JPG")) {
        ext = ".jpg";
      } else if (extension.equals("*.png,*.PNG")) {
        ext = ".png";
      } else if (extension.equals("*.gif,*.GIF")) {
        ext = ".gif";
      } else if (extension.equals("*.wbmp,*.WBMP")) {
        ext = ".wbmp";
      } else if (extension.equals("*.jpeg,*.JPEG")) {
        ext = ".jpeg";
      } else if (extension.equals("*.bmp,*.BMP")) {
        ext = ".bmp";
      }
    }
    

    示例过滤器:

    package example
    
    import java.io.File;
    import javax.swing.filechooser.FileFilter;
    
    class JPGSaveFilter extends FileFilter {
      @Override
      public boolean accept(File f) {
        if (f.isDirectory()) {
          return false;
        }
    
        String s = f.getName().toLowerCase();
    
        return s.endsWith(".jpg");
      }
    
      @Override
      public String getDescription() {
        return "*.jpg,*.JPG";
      }
    }
    

    【讨论】:

      【解决方案2】:

      准备文件选择器过滤器:

          jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("File X (.xxx)", "xxx"));
          jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("File Y (.yyy)", "yyy"));
          jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("File Z (.zzz)", "zzz"));
      
          // set default type
          jFileChooser.setFileFilter(jFileChooser.getChoosableFileFilters()[0]);
      
          // set default file
          jFileChooser().setSelectedFile(defaultFile);
      

      批准验证后

      //Add extension to Selected file 
      File file = new File(jFileChooser().getSelectedFile().getCanonicalPath() + "." + ((FileNameExtensionFilter) jFileChooser().getFileFilter()).getExtensions()[0]);
      

      验证所选文件是否带有扩展名是个好主意。

      【讨论】:

      • 我只能说,LOD 原则在这个答案中被忽略了。
      • 天啊,再次!对不起,不是我,我只是另一个面临这个问题的人。
      【解决方案3】:

      【讨论】:

      • ok.. setFileFilter 将在文件类型下拉菜单中显示扩展名。但是如何从这个文件类型下拉菜单中检索或使用选定的扩展名..
      • 一旦你选择了文件,它应该就像 String ext = file.getName().substring(file.getName().lastIndexOf("."));
      • 这是一个非常疯狂的 URL...它包含三个“java”、“file”和“filter”。
      【解决方案4】:

      我想我得到了更好的解决方案。 将通过示例代码片段进行解释。

      这是我设置文件过滤器的方式:
      jFileChooser.setFileFilter(new FileNameExtensionFilter(".txt", "txt"));.

      在此之后的主要保存行:
      textArea1.write(new BufferedWriter(new FileWriter(jFileChooser.getSelectedFile().getAbsolutePath() + jFileChooser.getFileFilter().getDescription().replace("All Files", ""))));.

      当然最重要的是这个片段:jFileChooser.getSelectedFile().getAbsolutePath() + jFileChooser.getFileFilter().getDescription().replace("All Files", "")

      我唯一不喜欢的是,我找不到任何像 'getExtension' 这样的方法,这意味着如果没有不必要的字符串麻烦,你就不能有任何好的描述。


      好的,知道了。你可以这样做: jFileChooser.getFileFilter().toString().replaceFirst(".*extensions=\\[(.*)]]", ".$1").replaceFirst(".*AcceptAllFileFilter.*", "").

      不幸的是,它不是那么漂亮,但似乎很有魅力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多