Как вы наверное уже знаете, для использования предопределенных диалоговых окон применяется класс JOptionPane. Теперь мы опишем, как «вручную» создать собственное диалоговое окно.
На рис.1 показано типичное модальное диалоговое окно, содержащее сообщение. Подобное окно отображается на экране после того, как пользователь выбрал пункт меню About.
Для того чтобы реализовать такое окно, необходимо создать подкласс класса JDialog. По сути, это тот же процесс, которым мы воспользовались для создания главного окна приложения, расширяя класс JFrame.
Точнее говоря, нужно сделать следующее:
- В конструкторе вашего диалогового окна вызовите конструктор суперкласса JDialog. Добавьте в диалоговое окно компоненты пользовательского интерфейса.
- Добавьте обработчики событий.
- Задайте размер диалогового окна.
При вызове конструктора суперкласса нужно указать фрейм-владелец, заголовок окна и признак модальности.
Фрейм-владелец управляет местом отображения диалога. Вы можете указать null вместо владельца — тогда диалог будет принадлежать скрытому фрейму.
Признак модальности указывает на то, должны ли блокироваться другие окна вашего приложения, пока отображается диалог. Немодальные окна не блокируют другие окна.
Модальный диалог блокирует все остальные окна приложения(за исключением дочерних по отношению к этому диалогу). Вы используете немодальные диалоги для создания панелей инструментов, к которым постоянно открыт доступ.
С другой стороны, модальные диалоги вы будете использовать, чтобы вынудить пользователя ввести необходимую информацию, прежде чем продолжить работу приложения.
Начиная с Java SE 6, добавлены два дополнительных типа модальности. Документо-модальный диалог блокирует все окна, относящиеся к одному «документу», или, точнее говоря, все окна с тем же родительским корневым окном, что и у данного диалога.
Это решает проблему систем помощи. В более старых версиях пользователи не могли взаимодействовать с окнами справки, когда всплыли модальный диалог. Toolkit-модальный диалог блокирует все окна их одного и того же «toolkit»(набора инструментов).
Toolkit — это программа Java, запускающая несколько приложений, такая как механизм аплетов в браузере. Дополнительную информацию на эту тему можно найти по адресу http://www.oracle.com/technetwork/java/index.html
Ниже приведен фрагмент программы, создающая диалоговое окно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class AboutDialog extends JDialog { public AboutDialog(JFrame owner) { super(owner, "About DialogTest", true); // Метка с HTML-форматированием выравнивается по центру. add(new JLabel( "<html><h1><i>Все о Java</i></h1><hr>" + "Pro-java.ru уроки Java</html>"), BorderLayout.CENTER); // При активизации кнопки ОК диалогове окно закрывается. JButton ok = new JButton("ok"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); } }); // Кнопка ОК помещается в нижнюю часть окна. JPanel panel = new JPanel(); panel.add(ok); add(panel, BorderLayout.SOUTH); setSize(260, 160); } } |
Как видите, конструктор добавляет элементы пользовательского интерфейса, в данном случае — метки и кнопку. Кроме того, он добавляет обработчик кнопки и задает размер окна.
Для того чтобы отобразить диалоговое окно на экране, необходимо создать новый объект JDialog и вызвать метод setVisible():
1 2 |
JDialog dialog = new AboutDialog(this); dialog.setVisible(true); |
Фактически в программе, рассматриваемой здесь в качестве примера, диалоговое окно создается только единожды, а затем мы используем его повторно каждый раз, когда пользователь щелкает на кнопке About:
1 2 3 |
if(dialog == null) // Первый раз. dialog == new AboutDialog(this); dialog.setVisible(true); |
Когда пользователь щелкает на кнопке ОК, диалоговое окно должно закрываться. Эта реакция определяется в обработчике событий, связанных с кнопкой ОК:
1 2 3 4 5 6 7 |
ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); } }); |
Когда пользователь закрывает окно диалога, щелкая на кнопке Close, оно исчезает с экрана. Как и в классе JFrame, программист может изменять эту реакцию с помощью метода setDefaultCloseOperation().
Программа, демонстрирующая использование диалогового окна About, приведена ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; public class DialogTest { public static void main(String[] args) { // TODO Auto-generated method stub EventQueue.invokeLater(new Runnable(){ public void run() { DialogFrame frame = new DialogFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } /** * Фрейм содержащий меню. При выборе пункта File->About * отображается диалоговое окно. */ class DialogFrame extends JFrame { public DialogFrame() { setTitle("DialogTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // Создание меню File. JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu fileMenu = new JMenu("File"); menuBar.add(fileMenu); // Добавление пунктов меню About и Exit. // При выборе пункта About отображается диалоговое окно About JMenuItem aboutItem = new JMenuItem("About"); aboutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if(dialog == null) // в первый раз dialog = new AboutDialog(DialogFrame.this); dialog.setVisible(true); // отобразить диалог } }); fileMenu.add(aboutItem); // При активации пункта Exit программа завершается. JMenuItem exitItem = new JMenuItem("Exit"); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); fileMenu.add(exitItem); } public static final int DEFAULT_WIDTH = 300; public static final int DEFAULT_HEIGHT = 200; private AboutDialog dialog; } /* * Модальное диалоговое окно отображает сообщение * и ожидает щелчка на кнопке ОК. */ class AboutDialog extends JDialog { public AboutDialog(JFrame owner) { super(owner, "About DialogTest", true); // Метка с HTML-форматированием выравнивается по центру. add(new JLabel( "<html><h1><i>Все о Java</i></h1><hr>" + "Pro-java.ru уроки Java</html>"), BorderLayout.CENTER); // При активизации кнопки ОК диалогове окно закрывается. JButton ok = new JButton("ok"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); } }); // Кнопка ОК помещается в нижнюю часть окна. JPanel panel = new JPanel(); panel.add(ok); add(panel, BorderLayout.SOUTH); setSize(260, 160); } } |