FileFilter для JFileChooser не фильтрует файлы - не зачем, есть код - PullRequest
2 голосов
/ 16 августа 2011

Я хочу выбрать только файлы .csv с FileChooser, но когда открывается окно выбора, я вижу все расширения. Нужно ли устанавливать что-то большее, чем это?

        btnFile.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e){
                        chooser = new JFileChooser(); 
                        chooser.setCurrentDirectory(new java.io.File("."));
                        chooser.setDialogTitle("Choose Value File");
                        chooser.addChoosableFileFilter(new CSVFilter());

                        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { 
                          System.out.println("getCurrentDirectory(): " 
                             +  chooser.getCurrentDirectory());
                          System.out.println("getSelectedFile() : " 
                             +  chooser.getSelectedFile());
                          }
                        else {
                          System.out.println("No Selection ");
                          }

            }
        });

и фильтр является вложенным классом

class CSVFilter extends javax.swing.filechooser.FileFilter {
      public boolean accept(File f) {

        return f.isFile() || f.getName().toLowerCase().endsWith(".csv");
      }

      public String getDescription() {
        return "*.csv";
      }
    }

Ответы [ 8 ]

6 голосов
/ 16 августа 2011

Может быть, это должно быть:

    return f.isFile() && f.getName().toLowerCase().endsWith(".csv");

не:

    return f.isFile() || f.getName().toLowerCase().endsWith(".csv");
2 голосов
/ 28 августа 2012

Должно быть:

@Override
public boolean accept(File f) {
    return (f.isFile() && f.getName().toLowerCase().endsWith(".csv")) || f.isDirectory();
}

Он также уважает каталоги.

2 голосов
/ 16 августа 2011

Вам нужно FileFilter для фильтрации файлов из вида.ChoosableFileFilter не скрывайте файлы от просмотра, просто избегайте их выбора.Взгляните на JFileChooser # setFileFilter (javax.swing.filechooser.FileFilter)

2 голосов
/ 16 августа 2011

Логика неверна.Это должно быть

return f.isFile() && f.getName().toLowerCase().endsWith(".csv");

В настоящее время вы принимаете любой файл.

1 голос
/ 04 апреля 2013

попробуйте сделать так:

 public boolean accept(File file) {

        return file.isDirectory() || file.getAbsolutePath().endsWith(".csv");
}
1 голос
/ 16 августа 2011

Скорее всего, проблема будет в этой строке:

return f.isFile() || f.getName().toLowerCase().endsWith(".csv");

Это вернет true, если Файл f является файлом, независимо от того, является ли он файлом .csv.

Возможно, вы хотите условие И (&&), а не ИЛИ (||). Вы хотите принять любой файл, где это файл и его расширение .csv.

0 голосов
/ 16 августа 2011

Вам необходимо установить файл-фильтр, а не просто добавить его в качестве дополнительного фильтра

chooser.setFileFilter(new CSVFilter());
0 голосов
/ 16 августа 2011

В вашем CSVFilter есть метод с именем accept, который возвращает TRUE, если входным параметром является file OR csv file.

Всегда будет возвращаться TRUE с допустимым параметром файла.

Условие должно быть

...
if (f.isFile() && f.isCSVFile())
...
...