1

私が行っていることを簡単に説明し、コードの一部を提供します。

JComboBox でオプションを選択し、JComboBox での選択に基づいてファイルを除外する必要がある JFileChooser を開くボタンをクリックする小さな GUI があります。

たとえば、ユーザーがText FileJComboBox から選択し、ユーザーがボタンをクリックすると、ディレクトリとテキスト ファイルのみを表示する 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

フィールドとして追加するだけ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 に答える
1

に見えるHashMap外部を作成して、それを FileExtensionModel のコンストラクターに渡すことはできませんか?FileExtensionModelFileFilter

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

アップデート

HashMapまたは、拡張子をキーにして、FileFiltersを作成することもできます。

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 に答える