如何根据自定义ComboboxModel中的Map设置FileFilter?

时间:2013-03-28 18:41:34

标签: java jcombobox jfilechooser filefilter comboboxmodel

我将简要解释一下我发生了什么,然后提供我的一些代码。

我有一个小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类中处理大部分内容,那将会很棒。

2 个答案:

答案 0 :(得分:1)

您无法在HashMap之外创建FileExtensionModel FileFilterpublic 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();