java 将自定义 FileFilter 与 JFileChooser 结合使用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4832251/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using a custom FileFilter with a JFileChooser
提问by Chris V.
I need to filter files in a filechooser that only allows image files to be chosen. I cant seem to figure out whats wrong with my code here:
我需要在只允许选择图像文件的文件选择器中过滤文件。我似乎无法弄清楚我的代码有什么问题:
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;
}
}
}
It's telling me that my custom filter class that implements FileFilter isnt of type FileFilter. :/
它告诉我实现 FileFilter 的自定义过滤器类不是 FileFilter 类型。:/
回答by Pace
The JFileChooser needs you to extendan instance of javax.swing.filechooser.FileFilter
. Since you have implementsyour IDE is importing java.io.FileFilter
instead.
JFileChooser中需要你扩展的实例javax.swing.filechooser.FileFilter
。由于您已经实现了您的 IDE 正在导入java.io.FileFilter
。
回答by MeBigFatGuy
Your file filter should accept directories as well.
您的文件过滤器也应该接受目录。
if (file.isDirectory())
return true;
even tho your file selection mode is files only (which is correct).
即使您的文件选择模式仅为文件(这是正确的)。
回答by Seega
Since Java7 you can simply use FileNameExtensionFilter(String description, String... extensions)
instead of subclassing FileFilter
.
从 Java7 开始,您可以简单地使用FileNameExtensionFilter(String description, String... extensions)
而不是子类化FileFilter
.
A simple JFileChooser analog to the example would be:
该示例的一个简单 JFileChooser 模拟是:
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Image files", "jpg", "png", "gif", "bmp"));
I know the question was answered long ago, but this is actually the simplest solution.
我知道这个问题很久以前就得到了回答,但这实际上是最简单的解决方案。