Tôi cần phải lọc các tệp trong trình chỉnh sửa tệp chỉ cho phép chọn tệp hình ảnh. Tôi không thể tìm ra điều gì sai với mã của tôi ở đây:Sử dụng FileFilter tùy chỉnh với JFileChooser
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;
}
}
}
Điều đó cho tôi biết rằng lớp lọc tùy chỉnh của tôi triển khai FileFilter không thuộc loại FileFilter. :/
Cảm ơn, tôi đã làm điều đó và bây giờ nó hoạt động, nhưng theo mặc định thư mục là 'Documents' trong filechooser của tôi, vì vậy không có hình ảnh rõ ràng. Khi tôi cố gắng điều hướng đến một thư mục khác, chúng sẽ không hiển thị. Làm thế nào tôi có thể tạo thư mục mặc định khi trình chỉnh sửa mở được đặt thành thư mục Ảnh của tôi? –
Sử dụng phương thức setCurrentDirectory của JFileChooser. Bạn có chắc chắn bộ lọc của mình không chỉ từ chối tất cả các tệp có thể không? Tôi sẽ đặt một điểm ngắt trong phương thức chấp nhận để kiểm tra. – Pace
Đây là những gì tôi đã bị loại bỏ. – ncmathsadist