从JFileChooser中获取多个文件

3

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

使用JFileChooser是否可以实现这一点,还是我需要根据自己的要求设计一个文件选择器?

3个回答

11
您要查找的不是标准功能,但是您可以自定义选择器,使用JFileChooser.setAccessory(...),它将一个JComponent作为参数。因此,您可以创建一个带有列表的面板,可以添加和删除所选文件(或任何其他您想创建的JComponent),并将其作为文件选择器的附件添加进去。
请参见FileChooserDemo2以了解更多详细说明。
以下是示例。我刚刚创建了一个JList,您可以通过选择文件来添加到其中,并通过从列表中选择文件并单击“删除”来删除文件。当您单击“打开”时,可以从DefaultListModel获取所有文件。

enter image description here

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
+1 用来附件的 :) 几个年代之前,我使用了 Accessory 来在文件选择器中显示图像文件的缩放预览。 - dic19
1
@dic19 这个教程有一个演示,恰好做到了那一点。我承认我曾经抄过那段代码一两次,因为正好有同样的需求 :-D - Paul Samsotha
1
谁没有遇到过这种情况呢?:P 我现在记起来了,我为了满足那个要求卡了两天,直到我决定回头阅读教程。 - dic19

1

但是,不要直接使用文件选择器打开文件。

文件选择器并不会打开文件,它只是用于选择文件。

我需要将所有所需的文件添加到已选列表中。

我会将选定的文件添加到一个 JList 中。

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

您可以在 JList 中动态添加/删除文件。请阅读 Swing 教程中有关 如何使用列表 的章节以获取更多信息和可工作的示例。


0
你需要:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接