我将简要解释我正在进行的工作,然后提供一些代码。

我有一个小的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/

10-10 01:28