Файловый фильтр не отображается в JFileChooser при качании Java

У меня есть JButton, которому нужно открыть файл определенного расширения. Вкратце, я определяю JButton, добавляя к нему прослушиватель действий, который запускает JFileChooser, если JButton нажат. Я хочу добавить фильтр файлов, чтобы в JFileChooser отображались только файлы с расширением .mpg.

Компиляция не показывает ошибок, но при качании JFileChooser не показывает фильтрации доступных файлов (и не появляется опция «Файлы фильмов» в поле со списком - просто «Все файлы»). В двух словах кажется, что addChoosableFileFilter не имеет никакого эффекта.

Мой код:

final JFileChooser jfc = new JFileChooser(moviedir);
//add File Filter
jfc.addChoosableFileFilter(new FileFilter() {
@Override
public String getDescription() {
return "Movie files (*.mpg)";
}
@Override
public boolean accept(File f) {
if (f.isDirectory()) {return true;} 
else {return f.getName().toLowerCase().endsWith(".mpg");}
 }
});

Я также пробовал альтернативу

jfc.addChoosableFileFilter(new FileNameExtensionFilter("Movie files", "mpg"));

с той же судьбой. Все вышеперечисленное находится на JPanel JFrame моего свинга.

Я прочитал много связанных потоков, но не повезло.

Заранее спасибо за комментарии.


person mario go    schedule 06.11.2013    source источник


Ответы (5)


JFileChooser предоставляет пользователю простой механизм выбора файла. Информацию об использовании JFileChooser см. в разделе How to Use File Choosers в The Java Tutorial.

Следующий код вызывает окно выбора файлов для домашнего каталога пользователя, который видит только изображения .jpg и .gif:

JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
    "JPG & GIF Images", "jpg", "gif");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
   System.out.println("You chose to open this file: " +
        chooser.getSelectedFile().getName());
}

Попробуй это. Скопировано отсюда

person Jabir    schedule 06.11.2013
comment
Я нашел, где была ошибка: у меня была строка `int returnVal = Chooser.showOpenDialog(null);' перед файловым фильтром. Разумеется, файловый фильтр не применялся. Мораль дня: showOpenDialog всегда идет ПОСЛЕ (new JFileChooser()).setFileFilter(filter). Хотя вы прямо не указали на это, вы как бы привели меня к ответу. Спасибо. - person mario go; 11.11.2013

Попробуйте этот код. Это сработало для меня

вызовите свой файловый селектор следующим образом: -

JFileChooser fc = new JFileChooser("C:/");
            fc.setFileFilter(new JPEGImageFileFilter());

и создайте класс JPEGImageFileFilter следующим образом:

 class JPEGImageFileFilter extends FileFilter implements java.io.FileFilter
         {
         public boolean accept(File f)
           {
           if (f.getName().toLowerCase().endsWith(".jpeg")) return true;
           if (f.getName().toLowerCase().endsWith(".jpg")) return true;
           if (f.getName().toLowerCase().endsWith(".avi")) return true;
           if (f.getName().toLowerCase().endsWith(".mpeg")) return true;
           return false;
           }
         public String getDescription()
           {
           return "JPEG files";
           }

         }
person AJ.    schedule 06.11.2013

просто...

jfc.setFileFilter(new FileNameExtensionFilter("Movie files", "mpg"));
person subash    schedule 06.11.2013
comment
Спасибо, но я пытался. Тоже не работало (извините, забыл упомянуть). - person mario go; 06.11.2013

Просто приведите пример для справки.

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

import java.text.*;

public class TextReaderExapmle extends JFrame {

    private static final long serialVersionUID = -8816650884305666302L;
    private static final String FRAME_TITLE = "File Chosser demo";
    private static final Dimension FRAME_SIZE = new Dimension(400, 350);
    private JButton fileChoosingButton;
    private JTextArea textArea;
    private JFileChooser fileChooser;

    public TextReaderExapmle() {
        super(FRAME_TITLE);
        init();
        doLay();
        attachListeners();
    }

    private void init() {
        fileChoosingButton = new JButton(new FileChooseAction());
        textArea = new JTextArea();

        fileChooser = new JFileChooser(System.getProperty("user.dir"));
        fileChooser.setFileFilter(new TextFileFilter());
        fileChooser.setMultiSelectionEnabled(false);
    }

    private void doLay() {
        Container container = getContentPane();
        container.add(fileChoosingButton, BorderLayout.NORTH);
        container.add(new JScrollPane(textArea), BorderLayout.CENTER);

        setSize(FRAME_SIZE);
        setVisible(true);
    }

    private void attachListeners() {
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(1);
            }
        });
    }

    /**
     * read text from the selected text file and convert text to string
     * 
     * @param reader
     * @return converted string
     */
    private static String readTextFromFile(final FileReader reader) {
        if (reader == null)
            return "";
        StringBuffer buf = new StringBuffer();

        final int CACHE_SIZE = 1024;
        final char[] cache = new char[CACHE_SIZE];
        try {
            int b;
            while ((b = reader.read(cache)) != -1) {
                if (b < CACHE_SIZE)
                    buf.append(cache, 0, b);
                else
                    buf.append(cache);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buf.toString();
    }

    /**
     * open file chooser action
     */
    private class FileChooseAction extends AbstractAction {
        static private final String ACTION_LABEL = "Open File...";

        public FileChooseAction() {
            super(ACTION_LABEL);
        }

        public void actionPerformed(ActionEvent e) {

            int returnVal = fileChooser.showOpenDialog(fileChoosingButton);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                try {
                    FileReader reader = new FileReader(
                            fileChooser.getSelectedFile());
                    textArea.setText(readTextFromFile(reader));
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    /* file filter */
    private class TextFileFilter extends FileFilter {
        private final java.util.List<String> fileNameExtensionList = new ArrayList<String>();

        public TextFileFilter() {
            fileNameExtensionList.add("txt");
            fileNameExtensionList.add("java");
            fileNameExtensionList.add("log");
            fileNameExtensionList.add("xml");
            fileNameExtensionList.add("htm");
            fileNameExtensionList.add("html");
            fileNameExtensionList.add("html");
            fileNameExtensionList.add("properties");
            fileNameExtensionList.add("svg");
        }

        public boolean accept(File f) {
            if (f.isDirectory())
                return true;
            final String fileName = f.getName();
            int lastIndexOfDot = fileName.lastIndexOf('.');

            if (lastIndexOfDot == -1)
                return false;

            int fileNameLength = fileName.length();
            final String extension = fileName.substring(lastIndexOfDot + 1,
                    fileNameLength);

            return fileNameExtensionList.contains(extension);
        }

        public String getDescription() {
            StringBuffer buf = new StringBuffer("Text File(");
            for (String fn : fileNameExtensionList)
                buf.append(MessageFormat.format("*.{0};", fn));
            return buf.append(')').toString();
        }
    }

    public static void main(String[] args) {
        new TextReaderExapmle();
    }
}
person MouseLearnJava    schedule 06.11.2013

используйте следующий код и сделайте его более читаемым и простым:

окончательный JFileChooser jfc = новый JFileChooser (moviedir);

jfc.addCoosableFileFilter (новый FileNameExtensionFilter ("*.mpg", "mpg"));

person Nilesh Jadav    schedule 04.10.2014