如何使用JFileChooser保存文件?

15

我在我的应用程序中有一个名为“另存为”的方法,它将我的应用程序图像保存到计算机上的文件中。我使用JFileChooser来让用户选择所需的文件保存位置。问题是,除非用户明确地键入文件格式,否则它将不带扩展名保存文件。如何在“文件类型”下拉菜单中添加像jpg、png这样的格式?

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

 ImageIO.write(image,extension,file);
4个回答

16

最终,我解决了我的问题:

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

3

准备文件选择器过滤器:

    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]);

检查所选文件是否具有扩展名可能是一个好主意。


1
我可以说,在这个答案中,LOD原则被抛到了窗外。 - e.doroskevic
天啊,LOD又出现了!抱歉,这不是我,我只是另一个遇到这个问题的人。 - Daniel De León

1

setFileFilter会在文件类型下拉菜单中显示扩展名。但是如何从此文件类型下拉菜单中检索或使用所选的扩展名呢? - Lokesh Kumar
一旦您选择了文件,只需使用以下代码即可轻松获取文件扩展名:String ext = file.getName().substring(file.getName().lastIndexOf(".")); - Greg Case
1
这是一个相当疯狂的URL...它包含了"java"、"file"和"filter"每个词都出现了三次。 - ArtOfWarfare

0

我认为我有更好的解决方案。 将用示例代码片段进行说明。

这是我设置文件过滤器的方式:
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.*", "")

不幸的是,它看起来不太优雅,但似乎像魔法般地奏效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接