Я хочу ограничить размеры изображений, которые пользователи могут выбирать с помощью JFileChooser - PullRequest
0 голосов
/ 19 марта 2012

У меня есть JFileChooser, который позволяет пользователям выбирать изображение для себя. Я хочу ограничить изображения, которые они могут выбрать, изображениями квадратного размера, например -

ширина и высота 50

ширина и высота как 75, и т.д ...

Поэтому, когда они выбирают изображение с помощью JFileChooser и нажимают «Открыть», мне нужно проверить размер изображения, и если у него нет квадратных размеров, мне нужно предоставить пользователю диалоговое окно, информирующее их «Изображение должно иметь одинаковые ширина и высота ".

Я только изучаю свинг, поэтому я не знаю, как это сделать. Есть идеи, как это сделать? Есть ли способ перехватить обработчик события кнопки «Открыть»?

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Вы можете скрыть все изображения, которые не соответствуют правилам с реализацией FileFilter:

JFileChooser fileChooser = new JFileChooser(new File(filename));
fileChooser.addChoosableFileFilter(new MyFilter());

// Open file dialog.
fileChooser.showOpenDialog(frame);
openFile(fileChooser.getSelectedFile());

class MyFilter extends javax.swing.filechooser.FileFilter {
    public boolean accept(File file) {
        // load the image
        // check if it satisfies the criteria
        // return boolean result
    }
}
0 голосов
/ 23 марта 2012

Я пытался перезаписать

public void approveSelection () 

, получив собственный класс от JFileChooser, и, на первый взгляд, это сработало.

Метод вызван, я могу выполнить тест для выбранного файла и, если он потерпит неудачу, вызвать showOpenDialog (ref);.

Но ...

Работает нормально, когда я вызываю законный файл, и открывает новое диалоговое окно, если нет, но после этого диалоговое окно не закрывается снова нормально, и если принудительно вызвано X окна, я получаю StackTrace напечатан. Поэтому я предполагаю, что состояние диалога здесь критическое - оно не работает, если showOpenDialog вызывается рекурсивно.

Вот один из протестированных мной вариантов:

class ProportionalImageChooser extends JFileChooser
{
    private Component ref;

    public ProportionalImageChooser (File f)
    {
        super (f);
    }

    public int showOpenDialog (Component parent) 
    {
        ref = parent;
        return super.showOpenDialog (parent);
    }

    public void approveSelection () {
        System.out.println ("approving selection!");
        String fname = getSelectedFile ().getName (); 
        if (fname.matches (".*e.*")) {
            cancelSelection ();
            System.out.println ("Dialog: size doesn't match");
            showOpenDialog (ref);
        }
        else super.approveSelection ();
    }
}

Чтобы упростить тест, я проверил только имя файла, чтобы включить 'e' или нет.

Поэтому я предлагаю использовать подход Бориса и протестировать файл после завершения диалога. Если это не удается, немедленно откройте новый.

...