2011-01-28 73 views
5

我需要在文件选择器中筛选只允许选择图像文件的文件。我似乎无法弄清楚什么是错在这里我的代码:与JFileChooser一起使用自定义FileFilter

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的心不是我的自定义过滤器类。 :/

回答

3

JFileChooser需要你扩展javax.swing.filechooser.FileFilter的一个实例。由于您有器具您的IDE正在导入java.io.FileFilter

+0

谢谢,我做到了,现在它可以工作,但默认情况下,我的文件选择器中的目录是“文档”,因此没有明显的图像。当我尝试导航到另一个目录时,他们不会显示。当filechooser打开设置为我的图片文件夹时,如何创建默认目录? – 2011-01-28 20:12:21

3

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

if (file.isDirectory()) 
    return true; 

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

2

由于Java7,您可以简单地使用FileNameExtensionFilter(String description, String... extensions)而不是子类FileFilter

一个简单的JFileChooser模拟的例子是:

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

我知道这个问题早就有人接听,但其实这是最简单的解决方案。

相关问题