如何修正限制多选数量的JFileChooser在PropertyChangeListener中的取消选择行为,维持已选文件状态
如何修正限制多选数量的JFileChooser在PropertyChangeListener中的取消选择行为,维持已选文件状态
我明白你遇到的这个问题了——这种上下选择行为不一致确实很影响体验,核心原因是你当前的代码直接截取新选中数组的前3个来设置回去,但JFileChooser在用户选择列表上方的文件时,会把新选的文件放到选中数组的最前面,导致原来的3个里最后一个被挤出数组,结果反而替换了已选内容;而选择下方文件时,新文件会加到数组末尾,截取前3个刚好保留原来的选中项,所以才出现了两种不同的行为。
要解决这个问题,我们需要记录上一次合法的选中状态,当用户选中超过限制数量的文件时,直接恢复到上一次的合法选择,而不是截取当前的选中数组。具体修改步骤如下:
- 在
LimitSelectionHandler类中添加一个成员变量,用来保存上一次符合数量限制的选中文件数组 - 在
propertyChange方法中,先判断当前选中数量是否合法:- 如果合法(≤3),就更新这个记录变量
- 如果不合法(>3),就把文件选择器的选中状态恢复为记录的合法状态,同时弹出提示
下面是修改后的完整代码:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; public class FileChooserWithLimitedFilesSelection { private JPanel panel; private JFileChooser fileChooser; private JButton btnFileChooser; public FileChooserWithLimitedFilesSelection() { panel = new JPanel(); btnFileChooser = new JButton("Browse..."); btnFileChooser.addActionListener(new ButtonHandler()); panel.add(btnFileChooser); } private class ButtonHandler implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (fileChooser == null) { fileChooser = new JFileChooser(); fileChooser.setMultiSelectionEnabled(true); fileChooser.setAcceptAllFileFilterUsed(false); fileChooser.addPropertyChangeListener(new LimitSelectionHandler()); } int returnedValue = fileChooser.showDialog(null, "Select files"); } } private class LimitSelectionHandler implements PropertyChangeListener { // 记录上一次合法的选中文件数组 private File[] lastValidSelection = new File[0]; @Override public void propertyChange(PropertyChangeEvent evt) { File[] selectedFiles = fileChooser.getSelectedFiles(); int currentSelectionLength = selectedFiles.length; if (currentSelectionLength <= 3) { // 当前选中数量合法,更新记录的合法状态 lastValidSelection = selectedFiles.clone(); } else { // 选中数量超过限制,恢复到上一次的合法状态 fileChooser.setSelectedFiles(lastValidSelection); JOptionPane.showMessageDialog(fileChooser, "Only 3 selected files allowed.", "File chooser", JOptionPane.ERROR_MESSAGE); } } } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FileChooserWithLimitedFilesSelection fcwrfs = new FileChooserWithLimitedFilesSelection(); frame.add(fcwrfs.panel); frame.pack(); frame.setVisible(true); }); } }
这样修改后,不管你是选择列表上方还是下方的文件,只要选中数量超过3个,都会直接恢复到之前选中的3个文件,不会出现替换的情况,两种选择行为就统一了。
备注:内容来源于stack exchange,提问作者Saleh Rezq
相关产品推荐
相关产品推荐

