Je mets un JFileChooser
dans mon programme, mais cela ne prend que des images. J'ai donc décidé d'ajouter des filtres:
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?
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());
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.
Cette liste aurait beaucoup plus de formats si jai était installé.
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");
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());
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";
}
});
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());
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]