JFileChooser 过滤器
Posted
技术标签:
【中文标题】JFileChooser 过滤器【英文标题】:JFileChooser filters 【发布时间】: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。给您添麻烦了!
【参考方案1】:
我在我的程序中放置了一个 JFileChooser,但它只需要图像。
有关该操作系统上该 JRE 支持的类型列表,请使用 ImageIO
。
FileFilter imageFilter = new FileNameExtensionFilter(
"Image files", ImageIO.getReaderFileSuffixes());
看到的类型 - Java 1.6/Windows 7
bmp
jpg
jpeg
wbmp
png
gif
注意:不要对该列表进行硬编码!它可能会因版本而异,也可能会因操作系统而异。例如。
-
Windows 支持加载 BMP 我并不感到惊讶,但在 Mac 中会出现这种情况吗?
看到WBMP 提醒我这种格式的存在!
如果安装了jai,该列表将具有更多格式。
在选择器中显示的过滤器
【讨论】:
【参考方案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";
);
【讨论】:
这是你要找的课程:docs.oracle.com/javase/tutorial/uiswing/examples/components/… 请注意,这与本示例中的 .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]
【讨论】:
以上是关于JFileChooser 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何从 JFileChooser(JAVA Swing) 中禁用文件操作、文件选择和过滤面板?