Java™ SE 6 решил вопросы модальности, которые возникли в более ранних версиях платформы. Новая модель модальности включает разработчику к контексту, или пределу, блокированию модальности диалогового окна.
Прежде, чем проуступить с новой моделью модальности, рассмотрите следующие сроки:
Диалоговое окно — высокоуровневое всплывающее окно с title и границей, которая обычно принимает некоторую форму ввода от пользователя. Диалоговое окно может быть модальным или немодальным. Для получения дополнительной информации о диалоговых окнах, см. Краткий обзор Диалоговых окон в, Как Сделать Диалоговую страницу.
Модальное диалоговое окно — диалоговое окно, которое блокирует ввод к некоторым другим высокоуровневым окнам в приложении, за исключением окон, создаваемых с диалоговым окном как их владелец. Модальное диалоговое окно получает фокус окна, пока это не закрывается, обычно в ответ на нажатие кнопки.
Немодальное диалоговое окно — диалоговое окно, которое позволяет Вам работать с другими окнами, в то время как это диалоговое окно показывают.
В Java SE 6 было изменено поведение и модальных и немодальных диалоговых окон так, чтобы они всегда появились и сверху не только их родительских окон и всех блокированных окон также.
Следующие типы модальности поддерживаются в Java SE 6:
Немодальный тип — немодальное диалоговое окно не блокирует никакое другое окно, в то время как это видимо.
Модальный документом тип — модальное диалоговое окно документа блокирует все окна из того же самого документа, кроме окон от его дочерней иерархии. В этом контексте документ является иерархией окон, которые совместно используют общего предка, названного корнем документа, который является самым близким окном предка без владельца.
Модальный приложением тип — модальное диалоговое окно приложения блокирует все окна из того же самого приложения, кроме окон от его дочерней иерархии. Если несколько апплетов запускаются в среде браузера, браузеру позволяют обработать их или как отдельные приложения или как единственное приложение. Это поведение является зависящим от реализации.
Модальный инструментарием тип — модальное диалоговое окно инструментария блокирует все окна, которые работают в том же самом инструментарии, кроме окон от его дочерней иерархии. Если несколько апплетов запускаются, все они работают с тем же самым инструментарием. Следовательно, модальное диалоговое окно инструментария, показанное от апплета, может влиять на другие апплеты и все окна экземпляра браузера, который встраивает среду выполнения Java для этого инструментария.
Дополнительно, можно установить режим исключения модальности:
Режим исключения — Любое высокоуровневое окно может быть отмечено, чтобы не быть блокированным модальными диалоговыми окнами. Это свойство позволяет Вам установить модальный режим исключения. Dialog.ModalExclusionType перечисление определяет возможные модальные типы исключения.
Отметьте: новая модель модальности не реализует системную модальность, которая блокирует все приложения (включая приложения Java), которые выводятся на экран на рабочем столе, в то время как модальное диалоговое окно является активным.
Пример ModalityDemo демонстрирует первые три из четырех упомянутых выше типов модальности.
Это число было уменьшено, чтобы соответствовать на странице. Нажмите на изображение, чтобы просмотреть это в его естественном размере.
Переключитесь на Книгу 1, структурируют и выбирают Биографию title для книги, затем избранный OK.
Биография title будет выведена на экран в title диалогового окна. Введите имя, например - "Джон", в текстовое поле.
Переключитесь на Книгу 1, структурируют и изменяют title на Забавный Рассказ, затем избранный OK. Так как диалоговое окно для того, чтобы ввести имя является немодальным, можно легко переключиться на его родительский фрейм.
Отметьте: немодальное диалоговое окно title было изменено на Забавный Рассказ.
Введите некоторый текст в текстовом поле. Заметьте, что это подписывается именем, которое Вы вводили в немодальном диалоговом окне.
Переключитесь на немодальное диалоговое окно и попытайтесь поменять свое имя. Вы не будете в состоянии сделать так, потому что модальное диалоговое окно документа блокирует все окна в своей родительской иерархии.
Выполните ту же самую последовательность операций (шаги 3 - 9) для Книжного 2 родительского фрейма.
Попытайтесь переключиться на различные диалоговые окна. Вы заметите, что можно переключиться или на фрейм Классики или на фрейм Обратной связи так же как к диалоговому окну или Книжного 1 фрейма или Книжного 2 фрейма.
Переключитесь на родительский фрейм Обратной связи. Избранный Уровень Самостоятельно.
Диалоговое окно подтверждения появится. Попытайтесь переключиться на различные диалоговые окна. Вам только позволяют переключиться на диалоговое окно Классики, потому что стандартное диалоговое окно подтверждения является модальным диалоговым окном приложения, и это блокирует все окна из того же самого приложения. Однако, Вы заметите, что можно выбрать своего любимого классического автора во фрейме Классики. Этот фрейм был создан при использовании APPLICATION_EXCLUDE тип исключения модальности, который препятствует тому, чтобы все высокоуровневые окна были блокированы любыми модальными диалоговыми окнами приложения.
Следующий фрагмент кода показывает, как создать диалоговые окна различных типов модальности:
//The Book 1 parent frame
f1 = new JFrame("Book 1 (parent frame)");
...
//The modeless dialog box
d2 = new JDialog(f1);
...
//The document-modal dialog box
d3 = new JDialog(d2, "", Dialog.ModalityType.DOCUMENT_MODAL);
...
//The Book2 parent frame
f4 = new JFrame("Book 2 (parent frame)");
...
//The modeless dialog box
d5 = new JDialog(f4);
...
//The document-modality dialog box
d6 = new JDialog(d5, "", Dialog.ModalityType.DOCUMENT_MODAL);
...
//The excluded frame
f7 = new JFrame("Classics (excluded frame)");
f7.setModalityExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDED);
...
//The Feedback parent frame and Confirm Dialog box
f8 = new JFrame("Feedback (parent frame)");
...
JButton b8 = new JButton("Rate yourself");
b8.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showConfirmationDialog(null,
"I really like my book",
"Question (application-modal dialog)",
JOptionPane.Yes_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
}
});
Найдите полный код демонстрационного примера в ModalityDemo.java файл.
В Java SE 6 можно создать модальное диалоговое окно документа без родителя. Поскольку Dialog class является подклассом Window class, a Dialog экземпляр автоматически становится корнем документа, если у этого нет никакого владельца. Таким образом, если такое диалоговое окно модально документом, его контекст блокирования пуст, и это ведет себя, как будто это было немодальное диалоговое окно.
Создает немодальное диалоговое окно без title с указанным Frame владелец. Если значение для владельца будет нулем, то совместно используемый, скрытый фрейм будет установлен как владелец диалогового окна.
Устанавливает тип модальности для этого диалогового окна. См. ModalityType для возможных типов модальности. Если данный тип модальности не поддерживается, то MODELESS тип используется. Чтобы гарантировать, что тип модальности был установлен, вызовите getModalityType() метод после вызова этого метода.