Java 如何在JFileChooser窗口中选择多个文件

Java 如何在JFileChooser窗口中选择多个文件,java,swing,jframe,awt,jfilechooser,Java,Swing,Jframe,Awt,Jfilechooser,我不知道如何在JFileChooser窗口中一次选择多个文件。我想它已经启用了,因为我在JFileChooser对象上使用了setMultiSelectionEnabled(true)方法,但是当我尝试实际选择多个对象时,我不能这样做。我试过点击并拖动、CTRL和箭头键/点击、Alt和箭头键/点击、Shift和箭头键/点击,但仍然没有成功。我该怎么做 创建JFileChooser的代码: 当只使用一个文件时,解析方法工作正常。 在JFrame中按下按钮时调用此类 public class Fil

我不知道如何在JFileChooser窗口中一次选择多个文件。我想它已经启用了,因为我在JFileChooser对象上使用了
setMultiSelectionEnabled(true)
方法,但是当我尝试实际选择多个对象时,我不能这样做。我试过点击并拖动、CTRL和箭头键/点击、Alt和箭头键/点击、Shift和箭头键/点击,但仍然没有成功。我该怎么做

创建JFileChooser的代码: 当只使用一个文件时,解析方法工作正常。 在JFrame中按下按钮时调用此类

public class FileChooser implements ActionListener, Runnable
{
    private Parser parser = new Parser();
    private static File[] selectedFiles;
    private static File currentSelected;
    private JFileChooser jfc;

    public static File getSelectedFile()
    {
    return currentSelected;
}

public void actionPerformed(ActionEvent actionEvent)
{
        new Thread(this).start();
}

public void run()
{
    if ( Window.bFG5IsPressed() && Window.bFGAIsPressed() )
    {
        jfc  = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setMultiSelectionEnabled(true);
        int returnValue = jfc.showOpenDialog(null);

        if (returnValue == JFileChooser.APPROVE_OPTION)
        {
            selectedFiles = jfc.getSelectedFiles();
            for (File e : selectedFiles) {
                currentSelected = e;
                parser.parseAll(e.getAbsolutePath());
            }
        }
    }
    else if ( Window.bFG5IsPressed() )
    {
        jfc  = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        int returnValue = jfc.showOpenDialog(null);

        if (returnValue == JFileChooser.APPROVE_OPTION)
        {
            selectedFiles = jfc.getSelectedFiles();
            for (File e : selectedFiles) {
                currentSelected = e;
                parser.parseFG5(e.getAbsolutePath());
            }
        }

    }
    else if ( Window.bFGAIsPressed() )
    {
        jfc  = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        int returnValue = jfc.showOpenDialog(null);

        if (returnValue == JFileChooser.APPROVE_OPTION)
        {
            selectedFiles = jfc.getSelectedFiles();
            for (File e : selectedFiles) {
                currentSelected = e;
                parser.parseFGA(e.getAbsolutePath());
            }
        }

    }
    else
    {
        JOptionPane x = new JOptionPane();
        x.showMessageDialog(x, "Escolher tipo de arquivo");
        x.setLocation(300,300);
        x.setVisible(true);
    }
}

}

调用setMultiSelectionEnabled(true)。以下是一个运行示例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Arrays;

public class MultipleFileChooser extends JFrame {
    public static void main(String[] args) {
        MultipleFileChooser multipleFileChooser = new MultipleFileChooser();
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setMultiSelectionEnabled(true);
        JButton button = new JButton("Open Files");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int choice = fileChooser.showOpenDialog(multipleFileChooser);
                if (choice == JFileChooser.APPROVE_OPTION) {
                    File[] openFiles = fileChooser.getSelectedFiles();
                    System.out.println("Files: " + Arrays.toString(openFiles));
                }
            }
        });
        JPanel panel = new JPanel();
        panel.add(button);
        multipleFileChooser.add(panel);
        multipleFileChooser.setSize(new Dimension(400, 400));
        multipleFileChooser.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        multipleFileChooser.setVisible(true);
    }
}
附上截图供OP参考:

您什么时候使用了
设置MultiSelectionEnabled
?显示一个“请”。@realpointer我在创建JFrame@JoeyJohnJo请核对答案中的样本。无论您是否能够选择多个文件,请运行此命令。如果需要,请将其与代码进行比较。如果没有,请告诉我。您不应该创建线程。所有Swing组件都应该在事件分派线程(EDT)上更新。侦听器代码不会在EDT上执行。因此,不仅你的代码是错误的,它更复杂。我将考虑到这一点,并从线程中删除文件选择器。感谢you@joeyjohnjo无论您是否能够选择多个文件,请运行此命令。如果需要,请将其与代码进行比较。如果没有,那么让我知道。我做了这个,但没有运气。你是说你运行了这个示例程序,但它不起作用?您使用的操作系统是什么?你能从其他应用程序(如文本编辑器等)中选择多个文件吗?我测试了你的代码,它对我有效。我假设setMultiSelectionEnabled是为您所做的,所以我也添加了代码,但它不再工作。请看我的编辑,我添加了整个类,谢谢你,我看到你在另一个线程中创建了文件选择器。在不同的线程中创建UI可能会很混乱。是否可以尝试直接从
actionPerformed()
方法打开文件选择器,而不是从
run()
方法创建线程和调用?我不确定您的用例,但请尝试一下并让我知道。