Изменение выбранных файлов в JFileChooser в ответ на событие - PullRequest
3 голосов
/ 15 февраля 2011

Я бы хотел, чтобы мой JFileChooser разрешил выбор нескольких файлов, но с ограничением на количество файлов, которые можно выбрать одновременно.

В идеале я хотел бы ограничить выбор в режиме реального времени, причем приоритет отдается последнему выбранному файлу, т. Е. Когда выбран третий файл, первый файл (т. Е. Тот, который был выбран самым ранним) следует отменить выбор автоматически.

Я думал, что 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 открыто? Или есть другой способ ограничить размер выделения?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2011
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);
                }
            }
        }
    }
}
0 голосов
/ 15 февраля 2011

Я обнаружил, что эта ошибка специфична для внешнего вида Macintosh. setSelectedFile и setSelectedFiles вообще не работают на Mac (даже до открытия диалогового окна.) Мой пример кода отлично работает с внешним видом Metal.

Возможные обходные пути:

  • Используйте другой внешний вид
  • Используйте FileDialog вместо JFileChooser (не поддерживает выбор нескольких файлов)
...