【问题标题】:How to select multiple files in JFileChooser window如何在 JFileChooser 窗口中选择多个文件
【发布时间】:2019-12-06 03:20:48
【问题描述】:

我不知道如何在 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?请显示minimal reproducible example
  • @RealSkeptic 我添加了创建 JFrame 的类
  • @JoeyJohnJo 请检查答案中的示例。无论您是否能够选择多个文件,请运行此程序。如果然后将其与您的代码进行比较。如果没有,请告诉我。
  • 你不应该创建一个线程。所有 Swing 组件都应在事件调度线程 (EDT) 上更新。侦听器代码确实在 EDT 上执行。因此,您的代码不仅错误,而且更复杂。
  • 我会考虑到这一点并从线程中删除文件选择器。谢谢

标签: java swing jframe awt jfilechooser


【解决方案1】:

调用 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 参考:

【讨论】:

  • @joeyjohnjo 无论您是否能够选择多个文件,请运行此命令。如果然后将其与您的代码进行比较。如果没有,请告诉我。
  • 我做到了,但没有运气
  • 你的意思是你运行了这个示例程序但它没有工作?您使用的是什么操作系统?您是否可以从其他应用程序(例如文本编辑器等)中选择多个文件?
  • 我测试了你的代码,它对我有用。我假设 setMultiSelectionEnabled 是为你做的,所以我也添加到我的代码中,但它不再起作用。请查看我添加整个班级的编辑,谢谢
  • 我看到您正在另一个线程中创建文件选择器。在不同的线程中创建 UI 可能会很麻烦。您可以尝试直接从actionPerformed() 方法打开文件选择器,而不是创建一个线程并从run() 方法调用吗?我不确定您的用例,但请尝试一下并告诉我。
猜你喜欢
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多