【问题标题】:Using a custom FileFilter with a JFileChooser使用带有 JFileChooser 的自定义 FileFilter
【发布时间】:2011-01-28 19:28:30
【问题描述】:

我需要在只允许选择图像文件的文件选择器中过滤文件。我似乎无法弄清楚我的代码有什么问题:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


public class Viewer extends JFrame implements ActionListener{
 /**
  * 
  */
 private static final long serialVersionUID = 1L;

 private JMenuItem open;
 private JMenuItem exit;
 private JFileChooser fileChooser;
 private JLabel image;

 public Viewer(){
  super("Picture Viewer");
  this.setLayout(new BorderLayout());
  //this.setSize(400, 400);

  JPanel canvas = new JPanel();
  this.add(canvas, BorderLayout.CENTER);
  image = new JLabel();
  canvas.add(image, BorderLayout.CENTER);

  JMenuBar menubar = new JMenuBar();
  this.add(menubar, BorderLayout.NORTH);
  JMenu menu = new JMenu("File");
  menubar.add(menu);
  open = new JMenuItem("Open...");
  open.addActionListener(this);
  menu.add(open);
  exit = new JMenuItem("Exit");
  exit.addActionListener(this);
  menu.add(exit);

  this.setVisible(true);
  this.pack();
 }

 public void actionPerformed(ActionEvent e){
  if(e.getSource() == open){
   fileChooser = new JFileChooser();
   fileChooser.showOpenDialog(this);
   fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
   fileChooser.setFileFilter(new ImageFileFilter());

    int returnVal = fileChooser.showOpenDialog(null);
          if(returnVal == JFileChooser.APPROVE_OPTION) {
              File file = fileChooser.getSelectedFile();
              // bmp, gif, jpg, png files okay
              BufferedImage bi;
     try {
      bi = ImageIO.read(file);
               image.setIcon(new ImageIcon(bi));
     } catch (IOException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
     }
              // catch IOException
          }
      this.pack();
  }
  else if(e.getSource() == exit){
   System.exit(0);
  }
 }

 public static void main(String[] args){
  Viewer viewer = new Viewer();
 }
 public class ImageFileFilter implements FileFilter{
   private final String[] okFileExtensions = 
     new String[] {"jpg", "png", "gif", "bmp"};

   public boolean accept(File file)
   {
     for (String extension : okFileExtensions)
     {
       if (file.getName().toLowerCase().endsWith(extension))
       {
         return true;
       }
     }
     return false;
   }
 }
}

它告诉我实现 FileFilter 的自定义过滤器类不是 FileFilter 类型。 :/

【问题讨论】:

    标签: java image swing jfilechooser filefilter


    【解决方案1】:

    JFileChooser 需要您扩展javax.swing.filechooser.FileFilter 的实例。由于您有实现,因此您的 IDE 正在导入 java.io.FileFilter

    【讨论】:

    • 谢谢,我这样做了,现在它可以工作了,但默认情况下,我的文件选择器中的目录是“文档”,所以显然没有图像。当我尝试导航到另一个目录时,它们不会显示。当文件选择器打开时如何将默认目录设置为我的图片文件夹?
    • 使用 JFileChooser 的 setCurrentDirectory 方法。您确定您的过滤器不只是拒绝所有可能的文件吗?我会在 accept 方法中放一个断点来测试。
    • 这也是我发现的。
    • 如果答案能解决您的问题,您应该接受!
    【解决方案2】:

    您的文件过滤器也应该接受目录。

    if (file.isDirectory())
        return true;
    

    即使您的文件选择模式只是文件(这是正确的)。

    【讨论】:

      【解决方案3】:

      从 Java7 开始,您可以简单地使用 FileNameExtensionFilter(String description, String... extensions) 而不是子类化 FileFilter

      该示例的简单 JFileChooser 模拟如下:

      JFileChooser fileChooser = new JFileChooser();
      fileChooser.setFileFilter(new FileNameExtensionFilter("Image files", "jpg", "png", "gif", "bmp"));
      

      我知道这个问题很久以前就已经回答了,但这实际上是最简单的解决方案。

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多