Как ограничить JFileChooser разрешением выбора только определенного количества файлов? - PullRequest
0 голосов
/ 27 апреля 2019

Я создаю игру «Угадай, кто» в качестве независимого финального проекта для моего объектно-ориентированного университетского класса и столкнулся с проблемой. Одна из вещей, которые я хочу, чтобы моя программа могла делать, - это позволить пользователю загружать свои собственные файлы с компьютера, чтобы использовать его в игре «Угадай, кто». По сути, пользователь щелкает 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 голосов
/ 27 апреля 2019

Если вы хотите что-то сделать при изменении компонента (происходит событие), используйте 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);

Помните, однако, что это ограничение количества файлов, а не ограничение количества папок.

0 голосов
/ 27 апреля 2019

к сожалению, их невозможно сделать, потому что это ComponentUI связано!

@ trashgod сделано отличные примеры здесь

также вы можете сделать 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 
            }
...