2011-01-28 59 views
5

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. :/

Trả lời

3

JFileChooser cần bạn mở rộng ví dụ javax.swing.filechooser.FileFilter. Vì bạn có triển khai IDE của bạn đang nhập java.io.FileFilter thay thế.

+0

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? –

+0

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

+0

Đây là những gì tôi đã bị loại bỏ. – ncmathsadist

3

Bộ lọc tệp của bạn cũng phải chấp nhận thư mục.

if (file.isDirectory()) 
    return true; 

thậm chí tho chế độ chọn tệp của bạn chỉ là tệp (chính xác).

2

Vì Java7 bạn chỉ có thể sử dụng FileNameExtensionFilter(String description, String... extensions) thay vì phân lớp FileFilter.

Một JFileChooser analog đơn giản để ví dụ sẽ là:

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

Tôi biết các câu hỏi đã được trả lời từ lâu, nhưng đây thực sự là giải pháp đơn giản nhất.

Các vấn đề liên quan