JFileChooser выбирает пустой файл - PullRequest
5 голосов
/ 27 августа 2011

Я использую JFileChooser в качестве редактора для ячейки JTable. Я бы хотел, чтобы пользователь выбрал действительный файл с помощью JFileChooser, а затем, когда он нажимает клавишу ввода, путь к файлу сохраняется в ячейке. Это представляет проблему, если они хотят очистить ячейку. Поэтому я хочу, чтобы они очистили JFileChooser, и это установит ячейку с пустой строкой (или null, в зависимости от того).

Моя проблема в том, что если вы не выбрали файл, вы не можете нажать кнопку «Подтвердить». В моем коде "пусто!" никогда не печатается. Есть ли способ разрешить нажатие кнопки подтверждения, когда файл не выбран? Вот что я попробовал:

JFileChooser component = new JFileChooser(){
        public void approveSelection(){
            File f = getSelectedFile();
            if(f==null){
                System.out.println("empty!");
                return;
            }else{
                if(!f.exists()){
                    System.out.println("does not exist!");
                }else{
                    super.approveSelection();
                }

            }
        }
    };

Ответы [ 3 ]

4 голосов
/ 27 августа 2011

Вас может заинтересовать переопределение метода JFileChooser cancelSelection (), который вызывается, когда пользователь отменяет выбор файла.

возможно, это не интуитивно понятно и удобно для пользователя, чтобы выполнить очистку ячейки JTable с помощью выбора JFileChooser пустого имени файла,Лучше иметь маленькую кнопку рядом с ячейкой JTable, чтобы она очищала значение ячейки, если пользователь щелкает ее или любой другой параметр, чтобы сбросить значение ячейки и использовать JFileChooser только для изменения пути к файлу в ячейке.

1 голос
/ 28 августа 2011

Когда вы запускаете предоставленный код, он даже не попадает в обработчик ApproveSelection, если файл не выбран. Внутри есть код для предотвращения нулевого выбора. Это поведение вытекает из метода ApproveSelectionAction BasicFileChooserUI, который проверяет, что если имя файла имеет значение null, оно возвращает без вызова ApproveSelection для выбора, поэтому JFileChooser никогда не получает уведомление о нажатии «Принять». Это действительно длинная уродливая функция, поэтому даже если вы нашли способ получить к ней доступ, было бы сложно изменить поведение.

Несколько возможных путей обхода этого:

1) Вы можете встроить JFileChooser в другой компонент и вместо него отобразить родительский компонент. Затем вы добавили бы JFileChooser и вашу пользовательскую кнопку на ту же панель и добавили обработку кнопок для пользовательской кнопки. Пользовательская кнопка может обрабатывать пользователя, желающего ничего не выбирать. Этот пост может дать некоторые подсказки: JFileChooser, встроенный в JPanel

2) Вы можете использовать функцию «аксессуар» JFileChooser. Обычно он «предназначен» для предварительного просмотра типа файла, но поскольку он принимает произвольный компонент, поэтому нет никаких причин, по которым вы не могли бы добавить свою собственную кнопку «Нет файла», установить слушателя и закрыть диалоговое окно. если эта кнопка нажата и отправить уведомление в ячейку таблицы, что это должно быть пустое значение. Относительно легко.

3) вы можете попытаться взломать диалоговое окно JFileChooser, чтобы добавить дополнительную кнопку рядом с «Сохранить и отменить». Это, вероятно, не очень легко, и вам, вероятно, придется сделать что-то хитрое, чтобы найти кнопку «Отмена» и добавить еще одну кнопку в родительский элемент. Возможно, выполнимо, только если вы являетесь экспертом по Java.

4) вы можете создать какой-то «фальшивый» / специальный файл, который, если выбран, вы делаете исключение для обычной обработки и отображаете пустое имя файла вместо реального имени файла.

0 голосов
/ 27 августа 2011

Интересно, можете ли вы написать класс, расширяющий JFileChooser, и изменить текстовое поле, чтобы очистка его не отключала кнопку "Принять".

...