class TwoFrames{
public static void main(String[] args){ Fr1 f1 = new Fr1(" Основное окно");
Fr2 f2 = new Fr2(" Второе окно");
}
}
class Fr1 extends Frame{
Fr1(String s){ super(s); setLayout(null);
Font f = new Font("Serif", Font.BOLD, 15); setFont(f);
Label l = new Label('^TO главное окно", Label.CENTER); l.setBounds(10, 30, 180, 30); add(l);
setSize(200, 100); setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
class Fr2 extends Frame{
Fr2(String s){ super(s); setLayout(null);
Font f = new Font("Serif", Font.BOLD, 15); setFont(f);
Label l = new Label('^TO второе окно", Label.CENTER); l.setBounds(10, 30, 180, 30); add(l);
setBounds(50, 50, 200, 100); setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){ dispose();
}
});
}
}
Рис. 10.5. Программа с двумя окнами |
На рис. 10.5 представлен вывод этой программы. Взаимное положение окон определяется оконным менеджером операционной системы и может быть не таким, какое показано на рисунке.
Контейнер
Контейнер Dialog — это окно обычно фиксированного размера, предназначенное для ответа на сообщения приложения. Оно автоматически регистрируется в оконном менеджере графической оболочки, следовательно, его можно перемещать по экрану, менять его размеры. Но окно типа Dialog, как и его суперкласс — окно типа Window, — обязательно имеет родительское окно — владельца owner, который указывается в конструкторе.
Окно типа Dialog может быть
Есть четыре области блокировки, определяемые
Dialog.ModalityType:
□ modeless — отсутствие блокировки;
□ document_modal — блокируются родительские окна, образующие один документ, причем под документом здесь понимаются все окна с общим предком (document root);
□ appli cat I on_modal — блокируются родительские окна, относящиеся к одному приложению;
□ toolkit_modal — блокируются родительские окна, относящиеся к одному экземпляру класса Toolkit.
Более подробное и точное описание типов модальности приведено в документе The AWT Modality, хранящемся в файле docs/api/java/awt/doc-files/Modality.html.
В классе Dialog определена константа default_modality_type, равная application_modal в Java SE 6. Она неявно применяется в конструкторах класса и методе setModal(true).
Графическая система, в которой открыто окно, может не отрабатывать все типы модальности, поэтому в класс Toolkit введен логический метод
isModalityTypeSupported(Dialog.ModalityType modalityType), которым можно проверить тот или иной тип modalityType.
Отдельные окна можно исключить из области блокировки. Для этого в класс Window введен метод setModalExclusionType(Dialog.ModalExclusionType excType), аргументом которого служат константы из перечисления Dialog.ModalExclusionType:
□ no_exclude — отсутствие исключения;
□ application_exclude — модальные окна, имеющие тип модальности application_modal, не могут блокировать это родительское окно;
□ toolkit_exclude — модальные окна, имеющие тип модальности toolkit_modal, не могут блокировать это родительское окно.
Опять-таки графическая система, в которой открыто окно, может не отрабатывать все эти исключения, поэтому в класс Toolkit введен еще один логический метод —
isModalExclusionTypeSupported(Dialog.ModalExclusionType excType).
В классе Dialog более десяти конструкторов. Из них:
□ Dialog(Dialog owner) — создает немодальное диалоговое окно типа MODELESS с пустой строкой заголовка;
□ Dialog (Dialog owner, String title) - создает немодальное диалоговое окно типа
modeless со строкой заголовка title;
□ Dialog(Dialog owner, String title, boolean modal) — создает диалоговое окно, которое будет модальным типа default_modality_type, если параметр modal == true;
□ Dialog(Dialog owner, String title, boolean modal, GraphicConfiguration gc) — создает
диалоговое окно с конфигурацией, определяемой параметром gc.
Пять конструкторов аналогичны предыдущим, но создают диалоговые окна, принадлежащие окну типа Frame:
Dialog(Frame owner);
Dialog(Frame owner, String title);
Dialog(Frame owner, boolean modal);
Dialog(Frame owner, String title, boolean modal);
Dialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc);
Еще у пяти конструкторов, аналогичных предыдущим, первый параметр — типа Window, а не Frame.
Среди методов класса Dialog интересны методы, связанные с модальностью: метод
Dialog.ModalityType getModalityType();
возвращает установленный для окна тип модальности, а метод
setModalityType(Dialog.ModalityType type);