Рубрики
Без рубрики

Java Swing – Поддерживать диалоговое окно открытым

– Java Swing – Поддерживать диалоговое окно открытым

Наиболее распространенный (и простой) способом реализации диалога в нашем приложении является класс JOptionPane . В этой статье мы обсудим, как “перезаписать” поведение по умолчанию JOptionPane , который закрывает диалоговое окно, когда пользователь нажимает JOptionPane – созданную кнопку.

Что нам нужно знать, прежде чем мы перейдем к примерам, так это то, что когда мы используем JOptionPane в нашем приложении то, что действительно работает за кулисами, – это модальный JDialog . JOptionPane – это контейнер, который автоматически создает JDialog и добавляет себя в свою панель содержимого .

1. Основной Пример

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

package com.mkyong.stayup;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class KeepDialogUp {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        ImageIcon icon = new ImageIcon("src/images/turtle64.png");

        Object[] options = {"I DO LOVE TURTLES"};
        JOptionPane jop = new JOptionPane("Admit your love for turtles\nor you shall not pass!!"
                , JOptionPane.ERROR_MESSAGE, 0, icon, options, options[0]);

        JDialog dialog = new JDialog(frame, "You LOVE turtles", true);
        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        dialog.setContentPane(jop);

        jop.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (JOptionPane.VALUE_PROPERTY.equals(evt.getPropertyName())) {
                    dialog.dispose();
                    JOptionPane.showMessageDialog(null, "Good for you >:P");
                    System.exit(0);
                }

            }
        });
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }
}

Выход:

Если пользователь попытается закрыть окно, ничего не произойдет. Если пользователь нажимает кнопку “Я ДЕЙСТВИТЕЛЬНО ЛЮБЛЮ ЧЕРЕПАХ”, программа показывает следующее диалоговое окно, а затем завершает работу.

2. Пример со слушателями

Теперь давайте оживим предыдущий пример. Мы добавим WindowListener для обработки попытки пользователя закрыть диалоговое окно, и мы проверим ввод пользователя в Пропертихангелистенер .

package com.mkyong.stayup;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class KeepDialogUpExtended {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        ImageIcon icon = new ImageIcon("src/images/turtle64.png");

        Object[] options = {"I DO LOVE TURTLES"};
        JOptionPane jop = new JOptionPane("Admit your love for turtles\nor you shall not pass!!",
                JOptionPane.ERROR_MESSAGE, 0, icon, options, options[0]);

        JDialog dialog = new JDialog(frame, "You LOVE turtles", true);
        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        dialog.setContentPane(jop);

        dialog.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                JOptionPane.showMessageDialog(frame, "YOU SHALL NOT PASS", "!!",
                        JOptionPane.ERROR_MESSAGE);
            }
        });

        jop.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (JOptionPane.VALUE_PROPERTY.equals(evt.getPropertyName())) {
                    if (jop.getValue().equals(options[0])) {
                        dialog.dispose();
                        JOptionPane.showMessageDialog(null, "Good for you >:P");
                        System.exit(0);
                    } else {
                        JOptionPane.showMessageDialog(frame, "There is no\n>> ESC <<",
                                "You little shenanigan...", JOptionPane.ERROR_MESSAGE);
                    }
                }

            }
        });
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

}

Выход:

Если пользователь попытается закрыть окно:

Если пользователь нажмет кнопку Esc:

Это в значительной степени подводит итог этой механике. Некоторые могут возразить, что обработка пользовательского ввода традиционным способом, когда мы проверяем возвращаемое значение JOptionPane более эффективен в ресурсах. Может быть, а может и нет; в зависимости от остальной части кода эта механика может оказаться недостающей частью. Однако несомненно то, что чем больше вы знаете, тем выше вероятность того, что вы сделаете правильный выбор.

Рекомендации

  1. Остановка Автоматического Закрытия Диалогового Окна
  2. Диалоговое окно класса – API Java 8
  3. Класс JOptionPane – API Java 8

Оригинал: “https://mkyong.com/swing/java-swing-keep-dialog-window-up/”