2011-01-28 77 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")); 

我知道這個問題早就有人接聽,但其實這是最簡單的解決方案。

相關問題