Ограничьте допустимый выбор JFileChooser без использования .setFileSelectionMode - PullRequest
0 голосов
/ 05 января 2019

В настоящее время я пытаюсь реплицировать диалоговое окно выбора файла NetBeans «Открыть проект», потому что мне нужна похожая система выбора папки, отвечающей определенным условиям. Однако у меня возникают проблемы, когда я вынужден выбирать в диалоговом окне те, которые соответствуют моему условию, а не какую-либо папку. Как я мог сделать это?

РЕДАКТИРОВАТЬ: условие, необходимое для того, чтобы папка считалась проектом NetBeans, должно содержать папку nbproject.

Пока что я пытался использовать .setFileSelectionMode, но это не достаточно ограничительно для моих целей.

Мой код (в методе main):

JFileChooser chooser = new JFileChooser();
FileFilter filter = new FileFilter() {
    @Override
    public boolean accept(File f) {
        if (f.isDirectory()) {
            // check if this folder is a NetBeans Project
            File[] list = f.listFiles();
            for (File sub : list) {
                if (sub.isDirectory()) {
                    if (sub.getName().equals("nbproject")) {
                        return true;
                    }
                }
            }
                return false;
        } else {
            return false;
        }
    }

    @Override
    public String getDescription() {
        return "NetBeans Projects";
    }
};

// so I can select the folder...
// ...but I only want the user to be able to select stuff my filter accepts
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

chooser.addChoosableFileFilter(filter);
chooser.setFileFilter(new FileFilter() {
    @Override
    public boolean accept(File f) {
        return f.isDirectory();
    }

    @Override
    public String getDescription() {
        return "Folders";
    }
});
chooser.setAcceptAllFileFilterUsed(false);

chooser.showOpenDialog(null);

ADDENDUM: Вот пример структуры файла, по которой мне нужно было бы перемещаться:

C:\USER\Documents\NetBeansProjects
|- Project
   |- nbproject
|- New Folder (empty)

Я хочу иметь возможность выбрать только папку Project, а не New Folder. Оба все еще должны быть видны. Однако когда я выбираю New Folder, программа утверждает и закрывает окно. Это не то поведение, которое я хочу. Вместо этого я хочу, чтобы окно просто открывало папку.

(sidenote: я действительно не хочу переписывать весь класс только для этой цели. Но если это все сводится к этому, я мог бы использовать обходной путь, который не понадобится, чтобы это произошло.)

1 Ответ

0 голосов
/ 06 января 2019

Кажется, что нет прямого пути или подхода для решения этой проблемы. Тогда я воспользуюсь своим обходным путем.

Стимулом для выбора папки было упрощение сериализации (один объект на файл), но вместо этого я просто поместил все в один файл.

...