Диалогового механизма

Верхнего уровня всплывающих окон в "Java-Speak" называются диалоговые окна (или просто "Диалоги"). Они, как правило, используется для взаимодействия с пользователем — либо на дисплее появится сообщение или для ввода информации пользователем. Перед Java SE 6, диалоговых окнах были немодальное по умолчанию, с вариантом будет модальным. Когда появится диалоговое окно является модальным, то другие окна в заявлении от принятия заблокировали вход, если они не в диалоговом окне в качестве собственника. После того как пользователь Реагирует соответственно в диалоговое окно, то есть путем ввода входного или просто закрытие диалога, другие окна приложения становятся доступными снова.

Java SE 6 дает больше вариантов, касающихся диалогового механизма. Вы больше не будете ограничены возможности для одного уровня модальности: Вкл. Теперь у вас есть четыре отдельных параметров, заданных по новой Dialog.ModalityType перечисление:

  • MODELESS
  • APPLICATION_MODAL
  • DOCUMENT_MODAL
  • TOOLKIT_MODAL

Сначала давайте посмотрим на Modeless и APPLICATION_MODAL. Настройка Modeless средства немодальное диалоговое окно. Как и прежде, немодальное диалоговое окно не блокирует вклада в любое другое окно приложения. Другие модальное диалоговое окно может заблокировать ввод к нему, но немодальное одно не имеет никакого эффекта на другую. Если вы позвоните setModal () метод класса Диалог со значением ложной, она устанавливает для Dialog.ModalityType Modeless.

APPLICATION_MODAL параметр равен модальное диалоговое окно. Как и прежде, все окна приложений, которые не имеют модальное диалоговое окно, в их владельцу иерархии заблокировали получение фокуса. Это означает, что новые окна могут быть созданы из модальных диалоговых и примет ввода. Тем не менее, новые окна, созданные в других уже существующих Windows не может. Если вы позвоните setModal () метод диалога с истинным значением, она устанавливает модальность диалога с DEFAULT_MODALITY_TYPE, который приравнивает к APPLICATION_MODAL. Это позволяет унаследованного кода в силе, хотя новый код необходимо использовать новые setModalityType () метод.

На этом этапе вы можете спросить, что если вы не задается форма? Ответом является то, что первоначальной формой является модальным. Кроме того, если вы указываете логический механизм, он производит те же параметры, как вызов setModal () с тем логическое значение. Последний вариант явно устанавливая механизм, который имеет очевидный эффект.

DOCUMENT_MODAL и TOOLKIT_MODAL находятся там, где становится все интереснее. DOCUMENT_MODAL позволяет иметь разные наборы окна, модальная. Например, вы можете иметь модальное окно приложения, которое отображается окно справки. При условии, что оно имеет окно верхнего уровня, который не является частью основного иерархией приложения помощью окно может быть модальным. Кроме того, в окне справки можно создать другие модальных окон, которые имеют форму отдельно от основного окна и отдельно от модальных диалогов, которые создает окно справки. После модальных приложение, которое выводит модальное окно справки общая потребность при использовании JavaHelp библиотеке. Это типично, что пользователи хотят иметь возможность общаться с помощью, даже если текущее окно является модальным. Эта необходимость была должным образом не урегулированы до поддержки DOCUMENT_MODAL поскольку основное окно программы и окно помощи были различные иерархии владельцу.

Подумайте о TOOLKIT_MODAL как APPLICATION_MODAL, где применение только браузер. (В этом пункте что говорит о апплеты также относится и к приложениям с помощью технологии начали Java WebStart.) Эта настройка позволяет одному апплета в браузер, чтобы быть модальным, блокируя другие апплеты от принятия ввода. Это потому, что все апплеты загружаются с тем же Toolkit. Ваш апплета AWTPermission.toolkitModality должны быть включены для TOOLKIT_MODAL на работу.

В дополнение к созданию механизма тип окна, вы можете установить тип модальных исключения по телефону setModalExclusionType () объекта Window. Это позволяет исключить некоторые окна из себя согласно соответствующим типу механизма. SetModalExclusionType () принимает одно из трех значений из Dialog.ModalExclusionType перечисление:

  • NO_EXCLUDE
  • APPLICATION_EXCLUDE
  • TOOLKIT_EXCLUDE

Опции NO_EXCLUDE означает отсутствие модальных исключение. Окно ведет себя в соответствии с его текущей тип механизма. Две другие настройки позволяют использовать механизм типа, а также конкретные Windows позволяет принимать фокус ввода. Настройка APPLICATION_EXCLUDE указывает, что на уровне приложений, окно не будет вести себя в соответствии с ее формой. TOOLKIT_EXCLUDE указывает, что в обоих приложений и инструментария уровне, окно не будет вести себя в соответствии с ее формой. Существует нет способа для окна исключить поведения на уровне Toolkit, но не на уровне приложений.

Перед использованием механизма либо вида или исключение опцию, Вы можете попросить Инструментарий если поддерживается либо. Чтобы узнать, поддерживается ли конкретный механизм, используя булевы isModalityTypeSupported (Dialog.ModalityType modalityType) методом. Чтобы узнать, поддерживается ли исключение типа, использовать булевы isModalExclusionTypeSupported (Dialog.ModalExclusionType modalExclusionType) методом.

Вот программа, DualModal, которая отображает два кадра, которые используют DOCUMENT_MODAL обстановке. Каждый кадр имеет кнопку, которая создает документ модальных панели опций, приняв ввод. Этикетки выбрана кнопка изменения к тексту, который был введен при включенной опции панели закрывается.


   import javax.swing.*;

   import java.awt.*;

   import java.awt.event.*;



   public class DualModal {

     public static void main(String args[]) {

       Runnable runner = new Runnable() {

         public void run() {

           JFrame frame1 = new JFrame("Left");

           JFrame frame2 = new JFrame("Right");

           frame1.setDefaultCloseOperation(

              JFrame.EXIT_ON_CLOSE);

           frame2.setDefaultCloseOperation(

              JFrame.EXIT_ON_CLOSE);

           JButton button1 = new JButton("Left");

           JButton button2 = new JButton("Right");

           frame1.add(button1, BorderLayout.CENTER);

           frame2.add(button2, BorderLayout.CENTER);

           ActionListener listener = new ActionListener() {

             public void actionPerformed(ActionEvent e) {

               JButton source = (JButton)e.getSource();

               String text = getNewText(source);

               if (!JOptionPane.UNINITIALIZED_VALUE.equals(text

                  && text.trim().length() 0) {

                 source.setText(text);

               }

             }

           };

           button1.addActionListener(listener);

           button2.addActionListener(listener);

           frame1.setBounds(100100200200);

           frame1.setVisible(true);

           frame2.setBounds(400100200200);

           frame2.setVisible(true);

         }

       };

       EventQueue.invokeLater(runner);

     }

        private static String getNewText(Component parent) {

          JOptionPane pane = new JOptionPane(

            "New label", JOptionPane.QUESTION_MESSAGE

         );

        pane.setWantsInput(true);

        JDialog dialog = pane.createDialog(parent, "Enter Text");

        // Uncomment line and comment out next 

        //  to see application modal

        // dialog.setModalityType(

        //   Dialog.ModalityType.APPLICATION_MODAL);

        dialog.setModalityType(

           Dialog.ModalityType.DOCUMENT_MODAL);

        dialog.setVisible(true);

        return (String)pane.getInputValue();

     }

   }

Обратите внимание, как вы можете взаимодействовать с верхнего уровня диалога, а не раме под любой из них когда показывается диалог.

Вот что первоначальный пару кадров выглядит следующим образом:



javax.swing

А вот два кадра с их стеклами вариант:



javax.swing

Вы можете подумать, что изменение setModalityType () линия использовать APPLICATION_MODAL позволит вам взаимодействовать как с кадрами варианта одновременно. Оно не будет. Вы должны закончить с помощью одного варианта кадров прежде чем вы сможете довести до другого.

Две точки стоит упомянуть. Изменение модальности уже отображается окно имеет никакого эффекта. Вы должны показывать диалоговое окно и сделать ее видимой снова на новый механизм настройки вступили в силу.

Кроме того, до версии Java SE 6 АВТ любого окна или подкласса может использовать setAlwaysOnTop () объекта Window просить, чтобы оно всегда отображается на верхней части. Это не то же самое модальным и не мешает другим окнам получить фокус ввода.

Более подробную информацию о диалогового механизма, см. в статье.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>