Обработка windowClosing JFrame

96
21 ноября 2020, 23:30

решил сделать возможность обработки закрытия окна через "крестик".

Написал обработку события нажатия на "крестик"

mainActivity.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing (WindowEvent e) {
                super.windowClosing(e);
                if(!lastOperation.equals("Save") && !lastOperation.equals("Save as...")){
                    int n = saveCurrentFile("Хотите сохранить изменения перед выходом?");
                    if(n == 0) {
                        while (i > 0) {
                            String file = choiceFile.getTitleAt(choiceFile.getSelectedIndex());
                            Pattern pattern = Pattern.compile("(New).*");
                            Matcher matcher = pattern.matcher(file);
                            if (matcher.find()) {
                                saveAs();
                            }
                            else {
                                save();
                            }
                            choiceFile.remove(choiceFile.getSelectedIndex());
                            i--;
                        }
                        lastOperation = "Exit";
                        mainActivity.dispose();
                    }
                    else if (n == 1) {
                        lastOperation = "Exit";
                        mainActivity.dispose();
                    }
                    else if (n == -1) {
                        lastOperation = "PreExit";
                    }
                }
            }
        });

Какой вариант из всплывающего диалогового окна я бы не выбрал, все равно происходит закрытие формы.

Диалог, всплывающий при общении с пользователем имеет следующий вид

public int saveCurrentFile(String list){
        Object[] object = {"Да", "Нет"};
        int n = JOptionPane.showOptionDialog(mainActivity,
                list,
                "Сохранение файла",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE,
                null,
                object,
                object[0]);
        return n;
    }

В виде картинки это выглядит следующим образом

Пытаюсь сделать так, чтобы при закрытии диалогового окна через крестик главное окно не закрывалось. Подскажите что я сделал не так?

Answer 1

Вам необходимо изменить стандартное поведение при закрытии вызвав

jFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

А затем самостоятельно закрывать окно, если нужно:

JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
jFrame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        int confirm = JOptionPane.showOptionDialog(jFrame,
                    "Close?", "Exit", JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE, null, null, null);
        if (confirm == JOptionPane.YES_OPTION) {
           System.exit(1);
           jFrame.dispose();
        }
    }
});
jFrame.setSize(300, 200);
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
READ ALSO
Обработчик для определённого css-класса

Обработчик для определённого css-класса

У меня по приложению разбросано множество форм с полями ввода денежных величинДля удобства пользователя, который вставляет данные из разных...

101
Проверить статус загрузки аудио у всех элементов документа

Проверить статус загрузки аудио у всех элементов документа

На страницe находится несколько olЭто плейлисты

112