簡體   English   中英

更改JFileChooser中的選定文件以響應事件

[英]Changing selected files in a JFileChooser in response to an event

我希望我的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打開時,有沒有辦法以編程方式強制改變選擇? 或者是否有其他方法來限制選擇的大小?

我發現這個bug特定於Macintosh的外觀。 setSelectedFilesetSelectedFiles在Mac上根本不起作用(甚至在打開對話框之前。)我的示例代碼可以正常使用Metal外觀。

可能的解決方法包括:

  • 使用不同的外觀
  • 使用FileDialog而不是JFileChooser (不支持多個文件選擇)
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);
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM