/ / FileFilter за JFileChooser не филтрира файлове - не защо, има код - java, swing, jfilechooser, filefilter

FileFilter за JFileChooser не филтрира файловете - няма защо, има код - java, swing, jfilechooser, filefilter

Искам да избирам само .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";
}
}

Отговори:

6 за отговор № 1

Може би трябва да бъде:

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

не:

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

2 за отговор № 2

Логиката е грешна. Трябва да бъде

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

В момента приемате всеки файл.


2 за отговор № 3

Трябва ти FileFilter за филтриране на файлове от изгледа. ChoosableFileFilter не скривайте файловете от изгледа, просто избягвайте да ги избирате. Погледни JFileChooser # setFileFilter (javax.swing.filechooser.FileFilter)


2 за отговор № 4

Трябва да бъде:

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

Той също уважава директории.


1 за отговор № 5

Проблемът вероятно ще бъде с този ред:

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

Това ще върне true, ако файлът f е файл, независимо дали е .csv файл или не.

Вероятно искате условие AND (&&), а не условие OR (||). Искате да приемете всеки Файл, където е файл И разширяването е .csv.


1 за отговор № 6

опитайте се да направите следното:

 public boolean accept(File file) {

return file.isDirectory() || file.getAbsolutePath().endsWith(".csv");
}

0 за отговор № 7

Във вас CSVFilter имате метод наречен accept, който се връща TRUE ако входният параметър е file OR csv file.

Тя винаги ще се върне TRUE с валиден параметър на файла.

Условието трябва да бъде

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

0 за отговор № 8

Трябва действително да настроите filefilter не само да го добавите като допълнителен филтър

chooser.setFileFilter(new CSVFilter());