3

JFileChooser複数のファイルを選択できるようにしたいのですが、同時に選択できるファイルの数に制限があります。

理想的には、最も最近選択されたファイルを優先して、リアルタイムで選択を制限したいと思います。つまり、3番目のファイルが選択された場合、1番目のファイル(つまり、最も早く選択されたファイル)が自動的に選択解除されます。

私はPropertyChangeListenerこのようなものがうまくいくと思いました:

public static void main(String[] args) throws IOException {
    final JFileChooser fc = new JFileChooser(didir);
    fc.setMultiSelectionEnabled(true);
    fc.addPropertyChangeListener(new PropertyChangeListener() {
        private final Set<File> selected = Sets.newLinkedHashSet();
        public void propertyChange(PropertyChangeEvent evt) {
            if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(evt.getPropertyName())) {
                File[] selectedFiles = fc.getSelectedFiles();
                if (selectedFiles.length > 2) {
                    selected.addAll(Arrays.asList(selectedFiles));
                    int numToRemove = Math.max(0, selected.size() - 2);
                    Iterables.removeIf(Iterables.limit(selected, numToRemove),
                                       Predicates.alwaysTrue());
                    fc.setSelectedFiles(selected.toArray(new File[0]));
                }
            }
        }
    });
    fc.showOpenDialog(null);
}

ただし、への呼び出しfc.setSelectedFiles()は効果がありません(ただし、イベントは発生しますが、リスト内の選択は更新されません)。

が開いている間にプログラムで選択を強制的に変更する方法はありJFileChooserますか?または、選択範囲のサイズを制限する別の方法はありますか?

4

2 に答える 2

0

このバグはMacintoshのルックアンドフィールに固有のものであることがわかりました。 Macでは(ダイアログが開く前であっても)まったく機能しません。私のサンプルコードは、Metalのルックアンドフィールで正常に機能しますsetSelectedFilesetSelectedFiles

考えられる回避策は次のとおりです。

  • 別のルックアンドフィールを使用する
  • FileDialogの代わりに使用してくださいJFileChooser(複数のファイルの選択をサポートしていません)
于 2011-02-15T13:24:04.160 に答える
0
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JFileChooser;

public class MyClass {
    final static JFileChooser fc = new JFileChooser("/");
    public static void main(String[] args) throws IOException {
        fc.setMultiSelectionEnabled(true);
        fc.addPropertyChangeListener(new ChangeListener());
        fc.showOpenDialog(null);
    }

    private static class ChangeListener implements PropertyChangeListener{
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(evt.getPropertyName())) {
                File[] selectedFiles = fc.getSelectedFiles();
                File[] allowedFiles = new File[2];
                if (selectedFiles.length > 2) {
                    allowedFiles[0] = selectedFiles[1];
                    allowedFiles[1] = selectedFiles[0];

                        fc.setSelectedFiles(allowedFiles);
                }
            }
        }
    }
}
于 2011-02-15T13:26:40.223 に答える