21

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

有什么建议么?

4

6 回答 6

33

我在我的程序中放了一个 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让我意识到这种格式的存在!

,该列表将具有更多格式。

过滤器显示在选择器中

图像选择器

于 2012-11-23T00:05:16.720 回答
11

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

fc.addChoosableFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "tif");
于 2012-11-22T17:54:40.673 回答
7

我正在使用 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());
于 2014-04-14T06:45:20.193 回答
3

您使用了错误的 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";
        }

    });
于 2012-11-22T17:50:21.743 回答
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());
于 2017-07-24T04:09:31.863 回答
1

接受的答案(使用带有 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]
于 2019-05-10T09:15:33.870 回答