簡體   English   中英

從JFileChooser獲取多個文件

[英]Getting multiple files from JFileChooser

在我正在處理的GUI應用程序中,我需要選擇多個文件,而不是使用文件選擇器直接打開它我首先需要在Selected列表中添加所有必需的文件(這樣就可以不同地從不同的文件中再次選擇文件目錄我可以一次選擇所有目錄,然后打開添加到該列表中的所有文件)。 此外,我還應該能夠從那個選定文件列表中的文件中刪除多個文件。

這可能與JFileChooser或我是否需要根據我的要求設計一個?

您正在尋找的不是標准功能,但您可以使用JFileChooser.setAccessory(...)自定義選擇器,它將JComponent作為參數。 因此,您可以創建一個面板,其中包含一個列表,您可以添加和刪除所選文件(或您要創建的任何其他JComponent ),並將其作為附件添加到文件選擇器中。

有關此內容的更多說明,請參閱FileChooserDemo2

這是一個例子。 我剛創建了可以通過選擇文件添加的JList,並通過從列表中選擇文件並單擊刪除來刪除文件。 單擊“打開”時,可以從DefaultListModel獲取所有文件

在此輸入圖像描述

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

                }
            }
        });
    }
}

而不是使用文件選擇器直接打開它

文件選擇器不會打開文件,只是選擇一個文件。

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

我會將選定的文件添加到JList

此外,我還應該能夠從那個選定文件列表中的文件中刪除多個文件。

您可以從JList動態添加/刪除文件。 閱讀有關如何使用列表的Swing教程中的部分獲取更多信息和工作示例。

你會需要:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM