Наиболее распространенный (и простой) способом реализации диалога в нашем приложении является класс 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 более эффективен в ресурсах. Может быть, а может и нет; в зависимости от остальной части кода эта механика может оказаться недостающей частью. Однако несомненно то, что чем больше вы знаете, тем выше вероятность того, что вы сделаете правильный выбор.
Рекомендации
- Остановка Автоматического Закрытия Диалогового Окна
- Диалоговое окно класса – API Java 8
- Класс JOptionPane – API Java 8
Оригинал: “https://mkyong.com/swing/java-swing-keep-dialog-window-up/”