我想只选择带有FileChooser的.csv文件,但是当选择器打开时,我会看到所有扩展名。我需要更多地设置更多吗?
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 ");
}
}
});
和Filter是嵌套类
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";
}
}
答案 0 :(得分:6)
也许应该是:
return f.isFile() && f.getName().toLowerCase().endsWith(".csv");
不
return f.isFile() || f.getName().toLowerCase().endsWith(".csv");
答案 1 :(得分:2)
逻辑错误。它应该是
return f.isFile() && f.getName().toLowerCase().endsWith(".csv");
目前您正在接受任何文件。
答案 2 :(得分:2)
您需要FileFilter
来过滤视图中的文件。 ChoosableFileFilter
不会隐藏文件,只是避免选择它们。看看JFileChooser#setFileFilter(javax.swing.filechooser.FileFilter)
答案 3 :(得分:2)
应该是:
@Override
public boolean accept(File f) {
return (f.isFile() && f.getName().toLowerCase().endsWith(".csv")) || f.isDirectory();
}
它也尊重目录。
答案 4 :(得分:1)
问题可能在于这一行:
return f.isFile() || f.getName().toLowerCase().endsWith(".csv");
如果文件f
是文件,则无论是否为.csv文件,都将返回true。
您可能需要AND(&&)条件而不是OR(||)条件。你想接受任何文件,它是一个文件,它的扩展名是.csv。
答案 5 :(得分:1)
尝试这样做:
public boolean accept(File file) {
return file.isDirectory() || file.getAbsolutePath().endsWith(".csv");
}
答案 6 :(得分:0)
在您的CSVFilter中,您有一个名为accept的方法,如果输入参数为TRUE
,则返回file OR csv file
。
它将始终使用有效的文件参数返回TRUE
。
条件应该是
...
if (f.isFile() && f.isCSVFile())
...
答案 7 :(得分:0)
您需要实际设置filefilter,而不仅仅是将其添加为可选过滤器
chooser.setFileFilter(new CSVFilter());