如何限制JFileChooser仅允许选择特定数量的文件?

时间:2019-04-27 18:48:11

标签: java swing user-interface jfilechooser

我正在为我的面向对象的大学课程创建一个Guess Who游戏,作为一个独立的最终项目,并且遇到了问题。我希望我的程序能够执行的操作之一是让用户从计算机上载他/她自己的文件,以用于猜测谁游戏。基本上,用户单击JRadioButton,然后将打开FileChooser框,以便他/她可以导航到包含文件的文件夹。我意识到您可以使用setMultiSelectionEnabled(true)命令进行设置,以便选择多个文件,但是有没有办法将选择范围限制为仅25张图像(游戏板的大小)?有更简单的方法吗?我是否应该这样做,以便用户只能选择装有图像的文件夹?

我想要特定文件的原因是因为我想将图像加载到ImageIcon数组中,并将文件名(在扩展名之前)也加载到数组中。

这是我到目前为止的代码:

private class fileSelector implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser files = new JFileChooser(); //creates a new filechooser
            files.setCurrentDirectory(new File(System.getProperty("user.home"))); //starts the filechooser at the home directory
            FileNameExtensionFilter filter = new FileNameExtensionFilter("*.Images", "jpg", "png", "gif"); //only allows files with these extensions to be used
            files.addChoosableFileFilter(filter); //adds the filter


            files.setMultiSelectionEnabled(true); //makes it so you can select multiple files!
            files.showOpenDialog(null);
       }

    }


任何帮助都会很棒!谢谢!

2 个答案:

答案 0 :(得分:0)

遗憾的是,他们无法执行此操作,因为这与ComponentUI有关!

@trashgod做出了great examples here

您还可以像这样制作FileFilter

public class ImagesFilter extends FileFilter {

        @Override
        public boolean accept(File f) {
            if (f.isDirectory()) {
                File[] list = f.listFiles();
                if (list.length == 25) {
                    boolean ret = true;
                    for (File file : list) {
                        ret = ret && isMyImageType(file);
                    }
                    return ret;
                }
            }
            return false;
        }

        @Override
        public String getDescription() {
            //descripe it .
            return "";
        }

    }

,然后在JFileChooser.getIcon(File f)中覆盖它,以得到一个特殊的图标,该图标适合您的项目,例如:-

private final ImagesFilter filter = new ImagesFilter();
            @Override
            public Icon getIcon(File f) {
                if (filter.accept(f))
                {
                    //return your icon
                }
                return super.getIcon(f); //To change body of generated methods, choose 
            }

答案 1 :(得分:0)

如果要在组件更改(发生事件)时执行某些操作,请使用PropertyListener。每次用户更改选择时,都会发生一个事件。您可以将属性侦听器添加到文件选择器中,并检查他是否选择了比所需更多的文件。

看看这个例子(最多2个文件):

    JFileChooser files = new JFileChooser(); // creates a new filechooser
    files.setCurrentDirectory(new File(System.getProperty("user.home"))); // starts the filechooser at the home
                                                                            // directory
    FileNameExtensionFilter filter = new FileNameExtensionFilter("*.Images", "jpg", "png", "gif"); // only allows
                                                                                                    // be used
    files.addChoosableFileFilter(filter); // adds the filter

    files.setMultiSelectionEnabled(true); // makes it so you can select multiple files!
    files.addPropertyChangeListener(e -> {
        File[] selectedFiles = files.getSelectedFiles();
        if (selectedFiles.length > 2) {
            File[] selectedFilesNew = new File[2];
            // Select the first 2
            for (int i = 0; i < selectedFilesNew.length; i++) {
                selectedFilesNew[i] = selectedFiles[i];
            }
            files.setSelectedFiles(selectedFilesNew);
            JOptionPane.showMessageDialog(files, "Only 2 selected files allowed.", "File chooser",
                    JOptionPane.ERROR_MESSAGE);
        }
    });
    files.showOpenDialog(null);

请记住,这是文件计数限制,而不是文件夹计数限制。