java - 从 JFileChooser 获取多个文件

标签 java swing user-interface jlist jfilechooser

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

使用 JFileChooser 是否可行,或者我是否需要根据我的要求设计一个?

最佳答案

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

参见 FileChooserDemo2对此有更多解释。

这是一个例子。我刚刚创建了 JList,您可以通过选择文件将其添加到其中,并通过从列表中选择文件并单击删除来删除文件。当你点击打开时,所有的文件都可以从DefaultListModel

中获取

enter image description here

扩展 JComponent

FileListAccessory

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

                }
            }
        });
    }
}

关于java - 从 JFileChooser 获取多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290210/

相关文章:

java - 关于如何检查我的 Web 应用程序中的内存泄漏?

Java - JTabbedPane - 添加新面板时出现 ArrayIndexOutOfBoundsException

c# - 为什么在 UI 中使用 DataTable 是错误的?

java - Hibernate 与 Grails

java - 为什么我无法在创建实例或抛出异常时调用 initCause()

java - 需要从用户输入返回值

swift - 如何强制 UI Display 快速更新?

visual-studio - Visual Studio 2010 或更高版本的功能区 UI?

java - 在 Gradle 中获取 POM 父级

java - 当用户单击 "x"按钮时,我可以在 Java Swing 中做什么来最小化窗口(而不是关闭它)?