【问题标题】:JFileChooser filtersJFileChooser 过滤器
【发布时间】: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。给您添麻烦了!

标签: java image swing jfilechooser


【解决方案1】:

我在我的程序中放置了一个 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 提醒我这种格式的存在!

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

在选择器中显示的过滤器

【讨论】:

    【解决方案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";
              }
      
          });
      

      【讨论】:

      • 请注意,这与本示例中的 .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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-27
          • 1970-01-01
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多