2011-01-28 17 views
5

Necesito filtrar archivos en un selector de archivos que solo permite elegir archivos de imagen. Me parece que no puede averiguar cuál es incorrecto con mi código aquí:Uso de un FileFilter personalizado con un 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; 
    } 
} 
} 

Me está diciendo que mi clase de filtro personalizado que implementa filtros de archivos isnt del tipo de filtros de archivos. :/

Respuesta

3

El JFileChooser necesita que usted extienda una instancia de javax.swing.filechooser.FileFilter. Como tiene implementa su IDE está importando java.io.FileFilter en su lugar.

+0

Gracias, lo hice y ahora funciona, pero de forma predeterminada el directorio es 'Documentos' en mi selector de archivos, por lo que obviamente no hay imágenes. Cuando trato de navegar a otro directorio, no se muestran. ¿Cómo puedo crear el directorio predeterminado cuando el selector de archivos se abre en mi carpeta de imágenes? –

+0

Utilice el método setCurrentDirectory de JFileChooser. ¿Estás seguro de que tu filtro no solo está rechazando todos los archivos posibles? Pondría un punto de interrupción en el método de aceptación para probar. – Pace

+0

Esto es lo que descubrí también. – ncmathsadist

3

Su filtro de archivos también debe aceptar directorios.

if (file.isDirectory()) 
    return true; 

aunque el modo de selección de archivos solo contenga archivos (que es correcto).

2

Desde Java7 puede simplemente usar FileNameExtensionFilter(String description, String... extensions) en lugar de la subclase FileFilter.

Un simple analógica JFileChooser al ejemplo sería:

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

Sé que la pregunta fue respondida hace mucho tiempo, pero esto es en realidad la solución más simple.

Cuestiones relacionadas