1

我将简要解释我正在做的事情,然后提供我的一些代码。

我有一个小的 GUI,我在其中选择 JComboBox 上的一个选项,然后单击一个按钮,该按钮将打开一个 JFileChooser,它应该根据 JComboBox 中的选择过滤掉文件。

例如,用户Text File从 JComboBox 中进行选择,当用户单击按钮时,它将打开仅显示目录和文本文件的 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 类中处理其中的大部分内容,那就太好了。

4

2 回答 2

1

你不能创建你的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);
        }
    }
}

更新

或者您可以创建一个HashMapFileFilters,扩展名是关键。

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;
   }

    ....
}
于 2013-03-28T20:30:29.827 回答
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();
于 2013-03-28T20:41:40.167 回答