JFileChooser 过滤器

22

我正在程序中添加一个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);

有什么建议吗?


2
错误是什么?我通常使用JFileChooser#setFileFilter(..) - David Kroukamp
4
ImageFilter 包含在 java.awt.image.ImageFilter 中,你没有导入它。 - Robin
我刚刚在上面放了一些代码,但是我在我的实际代码中使用了Java导入。对此造成的麻烦我深感抱歉! - user1832583
6个回答

34

我正在我的程序中添加一个JFileChooser,但它只能选择图片。

若要获取该JRE在该操作系统上支持的类型列表,请使用ImageIO

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

看到的类型 - Java 1.6/Windows 7

bmp
jpg
jpeg
wbmp
png
gif

注意:不要硬编码这个列表!它可能会因版本和操作系统而改变。例如:

  1. 我并不惊讶Windows有支持加载BMP的功能,但是在Mac上也有吗?
  2. 看到WBMP提醒了我这样一种格式存在!

如果安装了,这个列表将会包含更多的格式。

在选择器中显示的过滤器

Image Chooser


10

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

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

6
我正在使用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());

我觉得我错过了导入部分...你觉得呢? - gumuruh

3

您正在使用错误的ImageFilter类 :-)

教程中的ImageFilter不是您导入的java.awt包中的ImageFilter。 这个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";
        }

    });

这是你要找的类:http://docs.oracle.com/javase/tutorial/uiswing/examples/components/FileChooserDemo2Project/src/components/ImageFilter.java - lbalazscs
1
请注意,这个例子中不匹配 .JPG 扩展名。假设您在一个不区分大小写的文件系统上,您应该使用 f.getName().toLowerCase().endsWith(".jpg") - Mgamerz
这排除了Windows上的目录,您应该使用FileNameExtensionFilter - mvreijn

1
你可以使用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());

1

已接受的答案(使用FileNameExtensionFilter和ImageIO.getReaderFileSuffixes())存在一些问题。

在我的系统上(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]

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