我将简要解释一下我发生了什么,然后提供我的一些代码。
我有一个小GUI,我在JComboBox上选择一个选项,然后单击一个按钮,打开一个JFileChooser,它应根据JComboBox中的选择筛选出文件。
例如,用户从JComboBox中选择Text File
,当用户单击该按钮时,它将打开仅显示目录和文本文件的JFileChooser。
在我的主要课程中,我在构造函数中有这个:
public MyApp() {
//init components and other logic
comboBox.setModel(new FileExtensionModel());
}
然后在那个班级我有按钮的方法打开文件追踪器:
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类中处理大部分内容,那将会很棒。
答案 0 :(得分:1)
您无法在HashMap
之外创建FileExtensionModel
FileFilter
,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);
}
}
}
您的FileExtensionModel类:
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)));
}
FileFilters,扩展名是关键。
public class MyFileFilter extends FileFiter() {
String extension;
String description;
public MyFileFilter(String extension, String description) {
this.extension = extension;
this.description = description;
}
....
}
然后为FileFilter创建一个类。
{{1}}
答案 1 :(得分:1)
您只需将其添加为字段即可访问FileExtensionModel
课程中的MyApp
个实例。因为它在构造函数中实例化,所以这应该不是问题。但是,由于您在匿名内部类中使用此字段,因此该字段必须为final
。
public class MyApp {
private final FileExtensionModel fileExtensionModel;
// ... your other fields
public MyApp() {
// ... you other init
fileExtensionModel = new FileExtensionModel();
comboBox.setModel(fileExtensionModel);
}
}
现在,在openFileAction
方法中,您应该有权访问fileExtensionModel字段,例如提取所选项(或您需要的任何其他方法)。类似的东西:
myFileType = fileExtensionModel.getSelectedItem();