Как сделать модальное окно java

Добавил пользователь Владимир З.
Обновлено: 17.09.2024

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 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" ) ;

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 )

frame1.setBounds ( 100 , 100 , 200 , 200 ) ;

frame1.setVisible ( true ) ;

frame2.setBounds ( 400 , 100 , 200 , 200 ) ;

frame2.setVisible ( true ) ;

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.setVisible ( true ) ;

return ( String ) pane.getInputValue () ;

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

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

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

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

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

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

Есть окно с пунктом меню Нарисовать → Ромб (все создается в NetBeans).

По нажатию этого пункта меню я хочу создать другой модальный JFrame , в котором задаются параметры рисования ромба (длина стороны и один из углов).Я создал это окно, добавив из контекстного меню к проекту форму JFrame

Как видно из кода

1 ответ 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками окна java netbeans swing или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.24.41238

Facebook
google+
e-mail

Занятие 9. Диалоговые окна (начало)

Основные отличия диалогового окна (ему, как нетрудно догадаться, в библиотеке swing соответствует класс JDialog) от уже знакомого нам обычного окна (JFrame) два:

А теперь немного попрограммируем: мы изменим наш исходный код и добавим в него вызов диалогового окна (вы можете скачать новый вариант программы – в котором уже два файла исходных кодов - по ссылке).

Прежде всего, посмотрите на код класса MoneyForNothing; в нем кое-что изменилось (изменения выделены жирным шрифтом):

setSize (new Dimension (600, 400));

Dimension sSize = Toolkit.getDefaultToolkit ().getScreenSize (),

if (fSize.height > sSize.height)

if (fSize.width > sSize.width)

setLocation ((sSize.width - fSize.width)/2,

// Обработать событие закрытия окна

addWindowListener (new WindowAdapter ()

public void windowClosing (WindowEvent e)

ConfirmExitDialog exitApp = new ConfirmExitDialog (null);

Прежде всего, изменено поведение по умолчанию для системной кнопки закрытия окна – для него назначено поведение DO_NOTHING_ON_CLOSE (т.е. ничего не делать при закрытии). Как же теперь завершить работу приложения, что делать после того как пользователь нажмет эту кнопку? Хотя мы и запретили непосредственное закрытие окна этой кнопкой, после нажатия на нее генерируется событие, т.е. некая информация, сигнализирующая о том, что что-то и где-то произошло. События и их обработка – это ключевой элемент работы с графическими интерфейсами и мы вскоре ими займемся вплотную. А пока (см.код выше) скажем только, что для принятия решения – завершать работу приложения или нет – мы вводим дополнительный элемент: диалоговое окно подтверждения, описанное в классе ConfirmExitDialog. В этом классе есть метод getExitFlag (), возвращающий логическое значение (истина – true или ложь – false). Если возвращается истина – основное окно закрывается и приложение завершает свою работу; если ложь – приложение остается активным.

Создание и вывод на экран диалогового окна производится стандартно:

ConfirmExitDialog exitApp = new ConfirmDialog (null);

Ниже этого фрагмента кода производится проверка результата, возвращаемого методом getExitFlag () из класса ConfirmExitDialog. Если этот метод возвращает true, то освобождаются все занятые приложением ресурсы (метод dispose ()) и выход.

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

Заметьте, что само диалоговое окно выводится в центре родительского окна (если только вы не передвигали его) и, кроме того, является модальным: до тех пор пока вы не сделаете в нем выбор, продолжить работу с приложением вы не сможете.

А теперь запустите FAR и откройте файл ConfirmExitDialog.java: будем разбираться.

На первый взгляд содержимое файла кажется сложным, но на самом деле все не так страшно. Прежде всего, обратите внимание, что мы импортируем пакет java.awt.event.*. В этом пакете собраны классы обработки событий. Их там много, но пока это мы пропустим. Далее, наше диалоговое окно наследует поведение стандартного диалогового окна JDialog, которое, конечно, же содержится в пакете javax.swing.*. Пока все очень напоминает код для обычного окна JFrame.

Далее, мы объявляем три поля:

private boolean exitFlag = true;

private JButton okButton = new JButton ("Да"),

closeButton = new JButton ("Нет");

Первое поле – флаг, сигнализирующий о том, нужно ли завершать работу приложения или нет (об этом мы рассказывали чуть выше). Два оставшихся – объявление кнопок с соответствующими метками. Думается, что вы без труда поймете как именно описываются кнопки.

Переходим к конструктору. Здесь есть кое-что с чем мы еще не сталкивались:

public ConfirmExitDialog (JFrame parent)

super (parent, "Выход", true);

getContentPane ().add (createGUI ());

// Обработчики событий мыши

okButton.addActionListener (new ActionListener ()

public void actionPerformed (ActionEvent e)

closeButton.addActionListener (new ActionListener ()

public void actionPerformed (ActionEvent e)

// Обработчик события закрытия диалога

addWindowListener (new WindowAdapter ()

public void windowClosing (WindowEvent e)

Во-первых, мы используем конструктор с параметром. В данном случае параметр – это ссылка на родительское окно, т.е. на окно, из которого был вызван диалог (вспомните, недавно мы об этом говорили). Т.к. вызов диалогового окна осуществлялся из JFrame, то, разумеется, тип параметра тоже JFrame.

Чуть ниже по исходному коду диалоговому окну задаются размеры, указывается, что не допускается изменять его размеры (setResizable (false)) и то, что окно располагается в центре относительно окна-предка JFrame. После идут обработчики событий, но о них разговор особый, а мы пока продолжим разбираться с остальным кодом.

Возможно, у вас уже возник вопрос: а заполняется содержимым само диалоговое окно, как компоненты (кнопки и проч.) добавляются в него? Операции по наполнению содержимого диалогового окна компонентами осуществляются в методе createGUI (). Этот метод (чуть позже мы рассмотрим его подробно) формирует и возвращает панель (грубо говоря – прямоугольник), на которой в нужных местах расположены все нужные компоненты. Эта панель добавляется к изначально пустому содержимому диалогового окна:

getContentPane ().add (createGUI ());

Здесь, метод getContentPane () возвращает панель содержимого самого диалогового окна , т.е. панель, служащая для размещения компонентов интерфейса. Панель содержимого существует всегда. Тут мы касаемся сложного и интересного вопроса архитектуры swing. Не останавливаясь на деталях, которые увели бы нас далеко в сторону, отметим пока только то, что панель содержимого (а также ряд других панелей) создается самой библиотекой swing специально для размещения ваших компонентов.

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

Метод CreateGUI () выглядит так:

// Сформировать панель с элементами GUI

private JPanel createGUI ()

JPanel mainPanel = new JPanel (new BorderLayout ()),

lblPanel = new JPanel (new FlowLayout ()),

botPanel = new JPanel (new FlowLayout (FlowLayout.RIGHT));

JLabel confirmLabel = new JLabel ("Завершить работу приложения?",

mainPanel.add (lblPanel, BorderLayout.CENTER);

mainPanel.add (botPanel, BorderLayout.SOUTH);

Я не могу понять, как создать модальное окно в JavaFX. По сути, у меня есть средство выбора файлов, и я хочу задать пользователю вопрос, когда он выбирает файл. Мне нужна эта информация, чтобы разобрать файл, поэтому выполнение должно дождаться ответа.

я видел этот вопрос но я не смог узнать, как реализовать это поведение.

задан 07 мая '12, 18:05

3 ответы

На мой взгляд, это не очень хорошее решение, потому что родительское окно все время активно.
Например, если вы хотите открыть окно как модальное после нажатия кнопки.

Теперь ваше новое окно ДЕЙСТВИТЕЛЬНО модальное - родительский блок. также Вы можете использовать

Мне пришлось использовать stage.initModality(Modality.APPLICATION_MODAL); чтобы заблокировать вызов родителя. Даже использование showAndWait() не блокировало вызывающего абонента (я звонил из JFXPanel - не уверен, что это имело какое-либо значение.) - Торуокер

Вот ссылка на решение Ранее я создал модальные диалоги в JavaFX 2.1. Решение создает модальный этап поверх текущего этапа и выполняет действия над результатами диалога с помощью обработчиков событий для элементов управления диалога.

Предыдущее связанное решение использует устаревший подход обработчика событий для выполнения действия после закрытия диалогового окна. Этот подход был действителен для реализаций до JavaFX 2.2. Для JavaFX 8+ нет необходимости в обработчиках событий, вместо этого используйте новый этап showAndWait() метод. Например:

Обратите внимание, что для того, чтобы все работало должным образом, важно инициализировать владельца рабочей области. и для инициализации модальности сцены либо WINDOW_MODAL or APPLICATION_MODAL.

В нем есть несколько высококачественных стандартных диалогов пользовательского интерфейса. JavaFX 8 и УправлениеFX, если они соответствуют вашим требованиям, я советую использовать их, а не разрабатывать свои собственные. Те встроенные JavaFX Диалог и Оповещение классы также имеют initOwner и initModality и showAndWait методы, так что вы можете установить для них модальность по своему усмотрению (обратите внимание, что по умолчанию встроенные диалоги являются модальными для приложения).

Читайте также: