我将简要解释我正在进行的工作,然后提供一些代码。
我有一个小的GUI,可以在其中选择JComboBox上的一个选项,然后单击一个按钮,该按钮将打开一个JFileChooser,该文件应根据JComboBox中的选择过滤掉文件。
例如,用户从JComboBox中选择Text File
,当用户单击按钮时,它将打开JFileChooser,仅显示目录和文本文件。
在我的主类中,我在构造函数中有这个:
public MyApp() {
//init components and other logic
comboBox.setModel(new FileExtensionModel());
}
然后在该类中,我有用于打开filechooser的按钮的方法:
private void openFilAction(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
return f.getName().endsWith(myFileType) || f.isDirectory();
}
public String getDescription() {
return "myFileType";
}
}
int choose = fc.showOpenDialog(this);
//do logic
}
最后是DefaultComboBoxModel的基本扩展:
public class FileExtensionModel extends DefaultComboBoxModel {
Map<String, String> selection;
public FileExtensionModel() {
selection = new HashMap<String, String>();
selection.put("Text File", ".txt");
selection.put("Rar File", ".rar");
selection.put("Zip File", ".rar");
selection.put("Tar File", ".tar");
selection.put("Ini File", ".ini");
for(String key : select.keySet()) {
this.addElement(key);
}
}
}
所以我想知道如何用
myFileType
内部的映射值替换FileExtensionModel()
,因为我无法从内部的FileFilter()
类访问它。欢迎任何建议,我不介意挪动代码。如果我可以在FileExtensionModel类中处理大部分内容,那就太好了。
最佳答案
您不能在HashMap
以外的FileExtensionModel
之外创建FileFilter
并将其传递给`FileExtensionModel的构造函数吗?
public class MyClass {
Map<String, String> selection;
FileExtensionModel fem;
MyClass() {
selection = new HashMap<String, String>();
selection.put("Text File", ".txt");
selection.put("Rar File", ".rar");
selection.put("Zip File", ".rar");
selection.put("Tar File", ".tar");
selection.put("Ini File", ".ini");
fem = new FileExtensionModel(selection);
}
}
private void openFilAction(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
return f.getName().endsWith(myFileType) || f.isDirectory();
}
public String getDescription() {
for (String key : selection.keySet()) {
if (selection.get(key).equals(myFileType)) {
return key;
}
}
return "";
}
}
int choose = fc.showOpenDialog(this);
//do logic
}
您的FileExtensionModel类:
public class FileExtensionModel extends DefaultComboBoxModel {
public FileExtensionModel(HashMap select) {
for(String key : select.keySet()) {
this.addElement(key);
}
}
}
更新
或者,您可以创建FileFilters的
HashMap
,扩展名是键。selection = new HashMap<String, String>();
selection.put("Text File", ".txt");
selection.put("Rar File", ".rar");
selection.put("Zip File", ".rar");
selection.put("Tar File", ".tar");
selection.put("Ini File", ".ini");
fem = new FileExtensionModel(selection);
HashMap<String, FileFilter> fileFilters = new HashMap<String, FileFilter>();
for (String key : selection.keySet()) {
fileFilters.add(new MyFileFilter(key, selection.get(key)));
}
然后为您的FileFilter创建一个类。
public class MyFileFilter extends FileFiter() {
String extension;
String description;
public MyFileFilter(String extension, String description) {
this.extension = extension;
this.description = description;
}
....
}
关于java - 如何在自定义ComboboxModel中基于 map 设置FileFilter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15689750/