Фильтры JFileChooser

Я помещаю JFileChooser в свою программу, но это только принимает изображения. Поэтому я решил добавить фильтры:

код

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

Я получил это прямо из учебников Java. Но Eclipse подчеркивает следующее как ошибку:

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

Любые предложения?

Ответы

Ответ 1

Я помещаю JFileChooser в свою программу, но это только принимает изображения.

Для списка типов, поддерживаемых этой JRE на этой ОС, используйте ImageIO.

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

Виды - Java 1.6/Windows 7

bmp
jpg
jpeg
wbmp
png
gif

Примечание: не перекодируйте этот список! Он может меняться от версии к версии и от ОС к ОС. НАПРИМЕР.

  • Я не удивлен тем, что Windows поддерживает загрузку BMP, но выходит ли это на Mac?
  • Видя WBMP предупредил меня о существовании такого формата!

В этом списке будет много других форматов, если .

Фильтр, как он отображается в выборе

Image Chooser

Ответ 2

аргумент fc.addChoosableFileFilter() должен быть подклассом javax.swing.filechooser.FileFilter. Например, вы можете изменить свой код как

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

Ответ 3

Я использую setFileFilter().

Мой код ниже (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());

Ответ 4

Вы используете неправильный класс ImageFiler: -)

ImageFilter из учебника не из пакета java.awt, который вы импортируете. Этот ImageFilter должен реализовать javax.swing.filechooser.FileFilter.

Проверьте, есть ли другой класс ImageFilter, определенный в учебнике, и используйте его.

Пример правильного файлового фильтра:

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

    });

Ответ 5

Вы можете использовать класс FileFilter, а затем использовать 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;
  }
}

Теперь в вашем основном классе:

fc.setFileFilter(new ImageFilter());

Ответ 6

Принятый ответ (с использованием FileNameExtensionFilter с ImageIO.getReaderFileSuffixes()) имеет некоторые проблемы.

В моей системе (jdk1.8.0_192 в Ubuntu) ImageIO.getReaderFileSuffixes() возвращает массив следующим образом:

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

Обратите внимание на первую пустую строку. Эта строка недопустима в FileNameExtensionFilter:

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

На заметку - в той же системе с версией openjdk "11.0.2" 2019-01-15 я получаю следующие расширения:

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