【问题标题】:Getting multiple files from JFileChooser从 JFileChooser 获取多个文件
【发布时间】:2014-08-09 00:34:39
【问题描述】:

在我正在开发的 GUI 应用程序中,我需要选择多个文件,但不是直接使用文件选择器打开它,我首先需要在选定列表中添加所有必需的文件(这样就不必再次选择文件并再次从不同的目录中,我可以一次选择它们,然后打开添加到该列表中的所有文件)。此外,我还应该能够从该选定文件列表中的文件中删除多个文件。

这可以使用 JFileChooser 实现吗?还是我需要根据自己的要求设计一个?

【问题讨论】:

    标签: java swing user-interface jlist jfilechooser


    【解决方案1】:

    您正在寻找的不是标准功能,但您可以自定义选择器,使用JFileChooser.setAccessory(...)JComponent 作为参数。因此,您可以创建一个带有列表的面板,您可以添加和删除所选文件(或您要创建的任何其他JComponent)并将其作为附件添加到文件选择器。

    请参阅FileChooserDemo2 了解更多说明。

    这是一个例子。我刚刚创建了 JList,您可以通过选择文件来添加它,并通过从列表中选择文件并单击删除来删除文件。点击打开后,可以从DefaultListModel获取所有文件

    FileListAccessory 扩展 JComponent 的类

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    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.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFileChooser;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.border.EmptyBorder;
    
    public class FileListAccessory extends JComponent implements PropertyChangeListener {
    
        private File file = null;
        private DefaultListModel model;
        private JList list;
        private JButton removeItem;
    
        public FileListAccessory(JFileChooser chooser) {
            chooser.addPropertyChangeListener(this);
    
            model = new DefaultListModel();
            list = new JList(model);
            JScrollPane pane = new JScrollPane(list);
            pane.setPreferredSize(new Dimension(200, 250));
    
            removeItem = createRemoveItemButton();
    
            setBorder(new EmptyBorder(10, 10, 10, 10));
            setLayout(new BorderLayout());
            add(pane);
            add(removeItem, BorderLayout.SOUTH);
    
        }
    
        public DefaultListModel getModel() {
            return model;
        }
    
        private void addFileToList() {
            model.addElement(file);
        }
    
        private void removeFileFromList() {
            if (list.getSelectedIndex() != -1) {
                 model.remove(list.getSelectedIndex());
            }
        }
    
        private JButton createRemoveItemButton() {
            JButton button = new JButton("Remove");
            button.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    removeFileFromList();
                }
            });
            return button;
        }
    
        @Override
        public void propertyChange(PropertyChangeEvent e) {
            boolean update = false;
            String prop = e.getPropertyName();
    
            //If the directory changed, don't do anything
            if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
                file = null;
                update = true;
                //If a file became selected, find out which one.
            } else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
                file = (File) e.getNewValue();
                update = true;
            }
    
            if (update && file != null) {
                addFileToList();
            }
        }
    }
    

    启动器

    import java.io.File;
    import javax.swing.DefaultListModel;
    import javax.swing.JFileChooser;
    import javax.swing.SwingUtilities;
    
    public class JavaApplication4 {
    
        public static void main(String[] args) {
    
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFileChooser fc = new JFileChooser();
                    FileListAccessory accessory = new FileListAccessory(fc);
                    fc.setAccessory(accessory);
    
                    int open = fc.showOpenDialog(fc);
                    if (open == JFileChooser.APPROVE_OPTION) {
                        DefaultListModel model = accessory.getModel();
                        for (int i = 0; i < model.getSize(); i++) {
                            System.out.println(((File)model.getElementAt(i)).getName());
                        }
    
                    }
                }
            });
        }
    }
    

    【讨论】:

    • 附件 +1 :) 几年前,我使用附件在文件选择器中显示图像文件的缩放预览。
    • @dic19 the tutorial 有一个演示,正是那个。我承认我已经偷了一些代码一次或两次,为了完全相同的要求:-D
    • 谁没有? :P 我现在记得我被这个要求困了两天,直到我决定回到根源阅读教程。
    【解决方案2】:

    但不是直接用文件选择器打开它

    文件选择器不会打开文件,它只是选择一个文件。

    我首先需要在选定列表中添加所有必需的文件

    我会将选定的文件添加到JList

    此外,我还应该能够从该选定文件列表中的文件中删除多个文件。

    您可以从 JList 中动态添加/删除文件。阅读 How to Use Lists 上的 Swing 教程部分,了解更多信息和工作示例。

    【讨论】:

      【解决方案3】:

      你需要:

      chooser.setMultiSelectionEnabled(true);
      File selected[] = chooser.getSelectedFiles();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多