有 Java 编程相关的问题?

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

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

我正在为我的面向对象的大学课程创建一个猜猜谁的游戏作为一个独立的最终项目,并且遇到了一个问题。我希望我的程序能够做到的一件事是让用户从计算机上传他/她自己的文件,用于猜谁的游戏。基本上,用户单击JRadioButton,然后文件选择器框将打开,以便他/她可以导航到包含文件的文件夹。我知道您可以使用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) 个答案

  1. # 1 楼答案

    可悲的是,他们没有办法做到这一点,因为这与ComponentUI有关

    @trashgood madegreat 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 
                }
    
  2. # 2 楼答案

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

    看看这个例子(max files 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);
    

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