JFileChooser 过滤器

Posted

技术标签:

【中文标题】JFileChooser 过滤器【英文标题】:JFileChooser filters 【发布时间】:2012-11-11 03:37:15 【问题描述】:

我在我的程序中放了一个JFileChooser,但这只需要图像。所以我决定添加过滤器:

代码

import javax.swing.*;

public class fileChooser 

 public static void main(String[] args) 
    JPanel panel = new JPanel();
    
    final JFileChooser fc = new JFileChooser();
    int file = fc.showOpenDialog(panel);
    fc.addChoosableFileFilter(new ImageFilter());
    fc.setAcceptAllFileFilterUsed(false);
 

我是直接从 Java 教程中得到的。但 Eclipse 将以下内容强调为错误:

fc.addChoosableFileFilter(new ImageFilter());
fc.setAcceptAllFileFilterUsed(false);

有什么建议吗?

【问题讨论】:

错误是??我通常使用JFileChooser#setFileFilter(..) ImageFilter 包含在您未导入的 java.awt.image.ImageFilter 我只是把上面的一些代码放在一起,但是我在我的真实代码中导入了java。给您添麻烦了! 【参考方案1】:

我在我的程序中放置了一个 JFileChooser,但它只需要图像。

有关该操作系统上该 JRE 支持的类型列表,请使用 ImageIO

FileFilter imageFilter = new FileNameExtensionFilter(
    "Image files", ImageIO.getReaderFileSuffixes());

看到的类型 - Java 1.6/Windows 7

bmp
jpg
jpeg
wbmp
png
gif

注意:不要对该列表进行硬编码!它可能会因版本而异,也可能会因操作系统而异。例如。

    Windows 支持加载 BMP 我并不感到惊讶,但在 Mac 中会出现这种情况吗? 看到WBMP 提醒我这种格式的存在!

如果安装了jai,该列表将具有更多格式。

在选择器中显示的过滤器

【讨论】:

【参考方案2】:

fc.addChoosableFileFilter() 的参数应该是javax.swing.filechooser.FileFilter 的子类。例如,您可以将代码更改为

fc.addChoosableFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "tif");

【讨论】:

【参考方案3】:

我正在使用 setFileFilter()。

我的代码在下面 (JAVA-JSE 1.6)

JFileChooser c = new JFileChooser();
//Setting Up The Filter
FileFilter imageFilter = new FileNameExtensionFilter(
    "Image files", ImageIO.getReaderFileSuffixes());

//Attaching Filter to JFileChooser object
c.setFileFilter(imageFilter);

//Displaying Filechooser
int rVal = c.showOpenDialog(new JPanel());

【讨论】:

我想我错过了导入部分...你不这么认为吗?【参考方案4】:

您使用了错误的 ImageFiler 类 :-)

教程中的 ImageFilter 不是来自您正在导入的 java.awt 包。 此 ImageFilter 必须实现 javax.swing.filechooser.FileFilter。

请检查教程中是否定义了其他ImageFilter类并使用它。

正确的文件过滤器示例:

new JFileChooser().addChoosableFileFilter(new FileFilter() 

        @Override
        public boolean accept(File f) 
            // TODO Auto-generated method stub
            return f.getName().endsWith(".jpg");
        

        @Override
        public String getDescription() 
            return "JPEG files";
        

    );

【讨论】:

这是你要找的课程:docs.oracle.com/javase/tutorial/uiswing/examples/components/… 请注意,这与本示例中的 .JPG 扩展名不匹配。假设您使用的是不区分大小写的文件系统,您应该改为使用f.getName().toLowerCase().endsWith(".jpg") 这排除了Windows上的目录,你应该使用FileNameExtensionFilter【参考方案5】:

你可以使用FileFilter类,然后使用setFileFilter()

class ImageFilter extends FileFilter 

@Override
public boolean accept(File pathname) 
  String filename = pathname.getName();
  if (pathname.isDirectory()) 
    return true;

   else if (filename.endsWith("jpg'") || filename.endsWith("jpeg") || filename.endsWith("png") || filename.endsWith("gif")) 
    return true;
   else 
    return false;
  

现在在你的主要课程中:

fc.setFileFilter(new ImageFilter());

【讨论】:

【参考方案6】:

接受的答案(使用带有 ImageIO.getReaderFileSuffixes() 的 FileNameExtensionFilter)有一些问题。

在我的系统上(Ubuntu 上的 jdk1.8.0_192)ImageIO.getReaderFileSuffixes() 返回如下数组:

[, jpg, tiff, bmp, pcx, gif, png, ppm, tif, pgm, wbmp, jpeg, pbm]

注意第一个空字符串。此字符串在 FileNameExtensionFilter 中无效:

IllegalArgumentException: Each extension must be non-null and not empty

对此的解决方案是删除空字符串 - 使用 Apache commons-lang:

String[] extensions = ArrayUtils.removeAllOccurences(ImageIO.getReaderFileSuffixes(), "");
FileFilter filter = new FileNameExtensionFilter("Images", extensions);

附带说明 - 在与 openjdk 版本“11.0.2”2019-01-15 相同的系统上,我得到了这些扩展:

[jpg, tif, tiff, bmp, gif, png, wbmp, jpeg]

【讨论】:

以上是关于JFileChooser 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式为 JFileChooser 设置文件过滤器

使用 JFileChooser 过滤文件类型

Swing-JFileChooser的使用

如何从 JFileChooser(JAVA Swing) 中禁用文件操作、文件选择和过滤面板?

简单的 JFileChooser FileFilter 不起作用

JFileChooser和FileFilter的使用,以及Java RandomAccessFile用法