web-dev-qa-db-fra.com

Filtres JFileChooser

Je mets un JFileChooser dans mon programme, mais cela ne prend que des images. J'ai donc décidé d'ajouter des filtres:

Code

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);
 }
}

Je l'ai obtenu directement des tutoriels Java. Mais Eclipse souligne les erreurs suivantes:

fc.addChoosableFileFilter(new ImageFilter());
fc.setAcceptAllFileFilterUsed(false);

Aucune suggestion?

18
user1832583

Je mets un JFileChooser dans mon programme, mais cela ne prend que des images.

Pour obtenir la liste des types pris en charge par ce JRE sur ce système d'exploitation, utilisez ImageIO .

FileFilter imageFilter = new FileNameExtensionFilter(
    "Image files", ImageIO.getReaderFileSuffixes());

Types vus - Java 1.6/Windows 7

bmp
jpg
jpeg
wbmp
png
gif

Remarque: ne codez pas en dur cette liste! Il peut changer d'une version à l'autre et d'un OS à l'autre. PAR EXEMPLE.

  1. Je ne suis pas surpris que Windows prenne en charge le chargement de BMP, mais cela arrive-t-il sur un Mac?
  2. Voir WBMP m'a alerté sur l'existence d'un tel format!

Cette liste aurait beaucoup plus de formats si jai était installé.

Filtrer tel qu'il apparaît dans un sélecteur

Image Chooser

28
Andrew Thompson

l'argument de fc.addChoosableFileFilter() doit être une sous-classe de javax.swing.filechooser.FileFilter. Par exemple, vous pouvez modifier votre code comme

fc.addChoosableFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "tif");
7
mazaneicha

j'utilise setFileFilter ().

Mon code est inférieur (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());
5
user2377528

Vous utilisez une mauvaise classe ImageFiler :-)

ImageFilter du didacticiel ne provient pas du package Java.awt que vous importez. Cet ImageFilter doit implémenter javax.swing.filechooser.FileFilter.

Veuillez vérifier s'il existe une autre classe ImageFilter définie dans le didacticiel et l'utiliser.

Exemple de filtre de fichiers approprié:

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";
        }

    });
2
Pawel Solarski

Vous pouvez utiliser la classe FileFilter, puis utiliser 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;
  }
}

Maintenant dans votre classe principale:

fc.setFileFilter(new ImageFilter());
1
bhavna garg

La réponse acceptée (en utilisant FileNameExtensionFilter avec ImageIO.getReaderFileSuffixes ()) a quelques problèmes.

Sur mon système (jdk1.8.0_192 sur Ubuntu) ImageIO.getReaderFileSuffixes () renvoie un tableau comme celui-ci:

[, jpg, tiff, bmp, pcx, gif, png, ppm, tif, pgm, wbmp, jpeg, pbm]

Notez la première chaîne vide. Cette chaîne n'est pas valide dans FileNameExtensionFilter:

IllegalArgumentException: Each extension must be non-null and not empty

Une solution à cela serait de supprimer la chaîne vide - en utilisant Apache commons-lang:

String[] extensions = ArrayUtils.removeAllOccurences(ImageIO.getReaderFileSuffixes(), "");
FileFilter filter = new FileNameExtensionFilter("Images", extensions);

Sur une note latérale - sur le même système avec la version openjdk "11.0.2" 2019-01-15 j'obtiens ces extensions:

[jpg, tif, tiff, bmp, gif, png, wbmp, jpeg]
1
Shyrtol