有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JFileChooser在JTextField中显示多个选定文件

final JFileChooser fc = new JFileChooser();
   File[] files = fc.getSelectedFiles();

   private void showTxtFileFrame() {
       fc.setMultiSelectionEnabled(true);
       fc.setCurrentDirectory(new File(System.getProperty("user.home")));
       int result = fc.showOpenDialog(this);   
       if(result == JFileChooser.APPROVE_OPTION) {
            textfield1.setText(fc.getSelectedFile().getAbsolutePath());
    }

我想选择多个文件并将它们列在我的文本字段中。我可以选择多个文件,但它只显示单个文件的绝对路径


共 (1) 个答案

  1. # 1 楼答案

    首先,我会在GUI组件中显示多个文件路径,这更适合显示多个对象,比如JList。另一方面,JFileChooser API将告诉您哪个方法只返回单个文件,哪个方法返回File[]:getSelectedFiles()的数组。注意结尾的s

    当然,你不能把一个数组放到一个JTextField中,但我猜一旦你得到数据,你就知道该怎么处理它了

    而且,这毫无意义:

    final JFileChooser fc = new JFileChooser();
    File[] files = fc.getSelectedFiles();
    

    因为您实际上是在显示文件选择器对话框之前调用getSelectedFiles()。您要做的是在showTxtFileFrame()方法中调用该方法,就像您当前调用getSelectedFile()


    例如:

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class JFileChooserExample extends JPanel {
        // use a list model and JList that works *directly* with Files
        private DefaultListModel<File> fileListModel = new DefaultListModel<>();
        private JList<File> fileJList = new JList<>(fileListModel);
    
        public JFileChooserExample() {
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(new JButton(new SelectFilesAction("Select Files", KeyEvent.VK_S)));
    
            // help set the width and height of the JList
            fileJList.setVisibleRowCount(10);
            fileJList.setPrototypeCellValue(new File("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
            JScrollPane scrollPane = new JScrollPane(fileJList);
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    
            setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
            setLayout(new BorderLayout(3, 3));
            add(buttonPanel, BorderLayout.PAGE_START);
            add(scrollPane, BorderLayout.CENTER);
        }
    
        private class SelectFilesAction extends AbstractAction {
            public SelectFilesAction(String name, int mnemonic) {
                super(name);
                putValue(MNEMONIC_KEY, mnemonic);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fc = new JFileChooser();
                fc.setMultiSelectionEnabled(true);
                fc.setCurrentDirectory(new File(System.getProperty("user.home")));
                int result = fc.showOpenDialog(JFileChooserExample.this);   
                if(result == JFileChooser.APPROVE_OPTION) {
                    fileListModel.clear();  // clear the model of prior files
                     File[] files = fc.getSelectedFiles();
                     for (File file : files) {
                         // add all files to the model
                        fileListModel.addElement(file);
                    }
                }
            }
        }
    
        private static void createAndShowGui() {
            JFileChooserExample mainPanel = new JFileChooserExample();
    
            JFrame frame = new JFrame("JFileChooser Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }