从JFileChooser获取多个文件

use*_*619 3 java user-interface swing jfilechooser jlist

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

这可能与JFileChooser或我是否需要根据我的要求设计一个?

Pau*_*tha 11

您正在寻找的不是标准功能,但您可以自定义选择器,使用JFileChooser.setAccessory(...)它作为参数a 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

发射台

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());
                    }

                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)