JDialog . Графические интерфейсы пользователя Java

Класс JDialog расширяет класс Dialog библиотеки AWT и является «тяжеловесным» компонентом.

Он создает модальные или немодальные диалоговые окна.

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

Каждое диалоговое окно обязательно связано с родительским AWT окном Window, Dialog или Frame.

Диалоговое окно снабжено рамкой и строкой заголовка, в которую помещается строка, записанная в конструкторе.

В строке заголовка есть кнопка Закрыть, реакцию на которую, а заодно и реакцию на нажатие комбинации клавиш <Alt> + <F4>, можно установить методом setDefaultCloseOperation.

Модальность окна и его заголовок можно изменить методами setModalityType и setTitle.

По умолчанию диалоговое окно может изменять свои размеры, но это правило можно поменять унаследованным методом setResizable.

Как уже говорилось ранее, Swing предоставляет контейнеры верхнего уровня: JFrame, JDialog и JWindow.

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

При этом каждый GUI компонент может содержаться только один раз.

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

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

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

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

Получить панель содержимого контейнера верхнего уровня можно с помощью метода getContentPane.

Панель содержимого по умолчанию – это простой промежуточный контейнер, который наследуется от JComponent и использует BorderLayout в качестве менеджера компоновки.

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

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

Устройство контейнера верхнего уровня еще более сложное, чем это кажется на первый взгляд.

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

Корневая панель управляет панелью содержимого и панелью меню вместе с несколькими другими контейнерами.

Здесь слоистая панель layered pane содержит панель меню и панель содержимого и обеспечивает упорядочивание других компонентов по оси Z.

Стеклянная панель glass pane часто используется для перехвата входных событий, проходящих через контейнер верхнего уровня, а также может использоваться для рисования поверх нескольких компонентов.

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

В конструкторе класса используется панель содержимого для создания интерфейса диалога.

Также переопределяется метод createRootPane, который создает корневую панель, для закрытия диалога при нажатии кнопки «Escape».

В этом методе используется метод getKeyStroke класса KeyStroke для установки нажатия клавиши ESCAPE.

Данный текст является ознакомительным фрагментом.

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

igor.kudryashov (Igor Kudryashov)

#1

https://www.cuba-platform.ru/discuss/t/kak-zaprosit-podtverzhdenie-polzovatelya-pri-sohranenii-zapisi-posle-redaktirovaniya/3301

close(WINDOW_COMMIT_AND_CLOSE_ACTION)

jreznot (Yuriy Artamonov)

07.2019 19:30:30

#2

А не могли бы пояснить, в чём состоит ваша идея? Диалог подтверждения работает для всех редакторов из коробки.

igor.kudryashov (Igor Kudryashov)

#3

Значит что-то сломалось. Использую ваш учебник Руководство по разработке приложений Версия 7.0. При удалении записи выводится окно с запросом подтверждения действия. При создании новой записи и редактировании существующей ничего не выводится, запись сохраняется в любом случае при нажатии кнопки “ОК”. Это работает/не работает в любом Edit экране. В случае создания новой записи это может быть допустимо, но в случае редактирования, считаю что обязательно необходимо запросить у пользователя подтверждения действия, вдруг он случайно что-то изменил в записи.

Использую версию платформы 7.0.9, пробовал 7.0.8 и 7.0.7 — везде одно и то же.

jreznot (Yuriy Artamonov)

22.07.2019 07:32:13

#4

igor.kudryashov:

при нажатии кнопки “ОК”

А для чего выводить подтверждение сохранения? Стандартный диалог предупреждает о том, что несохранённые изменения могут потеряться.

Для кнопки OK вы можете показать такой диалог сами, если ваши системы всегда должны запрашивать подтверждение. Я редко вижу, чтобы любое сохранение требовало подтверждения, это прямо какой-то удар по usability.

2 симпатии

igor.kudryashov (Igor Kudryashov)

22. 07.2019 13:56:56

#5

jreznot:

Стандартный диалог предупреждает о том, что несохранённые изменения могут потеряться.

Не понял про стандартный диалог. Где он?

jreznot:

Я редко вижу, чтобы любое сохранение требовало подтверждения, это прямо какой-то удар по usability

Не любое, а после редактирования существующей записи, раз уж экранные формы не имеют режима/переключения чтения/редактирования, а всегда стразу открываются в режиме редактирования (при наличии прав), то предполагаю, что пользователь может не нарочно что-то изменить в форме. Если у пользователя будет спрашиваться подтверждение сохранения изменений, он будет понимать что что-то изменил. Как альтернативу вижу разные режимы открытия формы — “чтение”/“редактирование”, но не нашел такого поведения в стандартном приложении.

krivopustov (Konstantin Krivopustov)

22.07.2019 15:17:47

#6

Действие “view” недавно добавили в планы по разработке: https://github.com/cuba-platform/cuba/issues/2270

2 симпатии

igor.kudryashov (Igor Kudryashov)

#7

Как обычно строятся все приложения у нас — все экранные формы по умолчанию открываются в режиме чтения. Если пользователю необходимо внести изменения в данные, он нажимает кнопку “Изменить” или “Редактировать”, затем целенаправленно и осознано вносит изменения в запись базы данных и затем нажимает кнопку “Сохранить”.

Это позволяет предотвратить непреднамеренные изменения данных, когда наименование контрагента вдруг изменилось потому, что у тёти Клавы на клаву мобила упала.

Да, это не на Кубе…

1 симпатия

krivopustov (Konstantin Krivopustov)

27.07.2019 16:48:27

#8

Спасибо, учтем.

igor.kudryashov (Igor Kudryashov)

#9

Вижу добавили “Enable editing”.

Дано:

  • Таблица основных сущностей Order и таблица подчинённых сущностей Item. Связь “один-ко-многим”.
  • Экранная форма для просмотра таблицы Order, экранная форма для редактирования Order в которую встроена таблица Item, экранная форма для редактирования Item. Все табличные формы/представления имеют действие “view”, кроме обычных. Все формы редактирования сущностей имеют действие “enableEditing”.

Действия:

  • Открываем Order в режиме просмотра действием view.
  • В форме Order открываем в режиме просмотра Item.
  • Разрешаем редактирование Item.
  • Вносим какие-то изменения в Item и нажимаем “Сохранить”.

Результат:

java.lang.IllegalStateException: Range is class

ERROR com.haulmont.cuba.web.log.AppLog — Exception in com.haulmont.cuba.web.widgets.CubaButton:
com.vaadin.server.ServerRpcManager$RpcInvocationException: Unable to invoke method click in com.vaadin.shared.ui.button.ButtonServerRpc
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:157) ~[vaadin-server-8. 9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:115) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:431) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:396) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:260) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:82) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1580) ~[vaadin-server-8. 9.2-27-cuba.jar:8.9.2-27-cuba]
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.2.15.jar:7.2.15]
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.2.15.jar:7.2.15]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[servlet-api.jar:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:9.0.38]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.38]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.38]
at org. apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-5.2.16.RELEASE.jar:5.2.16.RELEASE]
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-5.2.16.RELEASE.jar:5.2.16.RELEASE]
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) ~[cuba-web-7.2.15.jar:7.2.15]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.38]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[catalina.jar:9.0.38]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[catalina.jar:9.0.38]
at org.apache. catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[catalina.jar:9.0.38]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[catalina.jar:9.0.38]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[catalina.jar:9.0.38]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) ~[catalina.jar:9.0.38]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[catalina.jar:9.0.38]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[catalina.jar:9.0.38]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-coyote.jar:9.0.38]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-coyote.jar:9.0.38]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-coyote.jar:9.0.38]
at org. apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-coyote.jar:9.0.38]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:9.0.38]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:9.0.38]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.reflect.InvocationTargetException: null
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java. base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:153) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
… 38 common frames omitted
Caused by: java.lang.IllegalStateException: Range is class
at com.haulmont.chile.core.model.impl.ClassRange.asDatatype(ClassRange.java:39) ~[cuba-global-7.2.15.jar:7.2.15]
at com.haulmont.cuba.web.gui.components.WebTextField.convertToModel(WebTextField.java:173) ~[cuba-web-7.2.15.jar:7.2.15]
at com.haulmont.cuba.web.gui.components.WebTextField.convertToModel(WebTextField.java:52) ~[cuba-web-7.2.15.jar:7.2.15]
at com.haulmont.cuba.web.gui.components.WebV8AbstractField.validate(WebV8AbstractField.java:198) ~[cuba-web-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.ScreenValidation.validate(ScreenValidation.java:100) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.ScreenValidation.lambda$validateUiComponents$0(ScreenValidation. java:93) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.ComponentsHelper.lambda$traverseValidatable$1(ComponentsHelper.java:96) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.ComponentsHelper.lambda$traverseComponents$0(ComponentsHelper.java:79) ~[cuba-gui-7.2.15.jar:7.2.15]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:274) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
at java. base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) ~[na:na]
at com.haulmont.cuba.gui.ComponentsHelper.traverseComponents(ComponentsHelper.java:78) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.ComponentsHelper.lambda$traverseComponents$0(ComponentsHelper.java:82) ~[cuba-gui-7.2.15.jar:7.2.15]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na]
at com.haulmont.cuba.gui.ComponentsHelper. traverseComponents(ComponentsHelper.java:78) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.ComponentsHelper.lambda$traverseComponents$0(ComponentsHelper.java:82) ~[cuba-gui-7.2.15.jar:7.2.15]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na]
at com.haulmont.cuba.gui.ComponentsHelper.traverseComponents(ComponentsHelper.java:78) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.ComponentsHelper.traverseValidatable(ComponentsHelper.java:94) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.ScreenValidation.validateUiComponents(ScreenValidation.java:92) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.StandardEditor.validateUiComponents(StandardEditor.java:543) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.StandardEditor.validateScreen(StandardEditor.java:528) ~[cuba-gui-7. 2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.StandardEditor.commitChanges(StandardEditor.java:414) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.StandardEditor.closeWithCommit(StandardEditor.java:600) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.screen.StandardEditor.commitAndClose(StandardEditor.java:566) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.bali.events.EventHub.publish(EventHub.java:170) ~[cuba-global-7.2.15.jar:7.2.15]
at com.haulmont.cuba.gui.components.actions.BaseAction.actionPerform(BaseAction.java:222) ~[cuba-gui-7.2.15.jar:7.2.15]
at com.haulmont.cuba.web.gui.components.WebButton.buttonClicked(WebButton.java:67) ~[cuba-web-7.2.15.jar:7.2.15]
at com.haulmont.cuba.web.widgets.CubaButton.fireClick(CubaButton.java:76) ~[cuba-web-widgets-7.2.15.jar:na]
at com.vaadin.ui.Button$1.click(Button.java:57) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
… 43 common frames omitted

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

krivopustov (Konstantin Krivopustov)

#10

Спасибо за сообщение о проблеме.
Какое поведение вы ожидаете в таком случае? Запрещать переход в режим редактирования у Item если владелец Owner в режиме чтения?

igor.kudryashov (Igor Kudryashov)

#11

Ну, наверное, “да”. Самое очевидное решение. И, мне кажется, это самое простое в реализации.

P.S. Студия предлагает на выбор названия action в этих кнопках, но в списках всё время какая-то ересь не по теме, правильно заполнить значение можно только вписав название акции руками.

krivopustov (Konstantin Krivopustov)

#12

Завел тикет: https://github.com/Haulmont/jmix-ui/issues/670

По выбору actions в Студии — в последних версиях Jmix Studio это работает нормально.

Документация JDK 20 — Главная

  1. Главная
  2. Ява
  3. Java SE
  4. 20

Обзор

  • Прочтите меня
  • Примечания к выпуску
  • Что нового
  • Руководство по миграции
  • Загрузить JDK
  • Руководство по установке
  • Формат строки версии

Инструменты

  • Технические характеристики инструментов JDK
  • Руководство пользователя JShell
  • Руководство по JavaDoc
  • Руководство пользователя средства упаковки

Язык и библиотеки

  • Обновления языка
  • Основные библиотеки
  • HTTP-клиент JDK
  • Учебники по Java
  • Модульный JDK
  • Руководство программиста API бортового регистратора
  • Руководство по интернационализации

Технические характеристики

  • Документация API
  • Язык и ВМ
  • Имена стандартных алгоритмов безопасности Java
  • банок
  • Собственный интерфейс Java (JNI)
  • Инструментальный интерфейс JVM (JVM TI)
  • Сериализация
  • Проводной протокол отладки Java (JDWP)
  • Спецификация комментариев к документации для стандартного доклета
  • Прочие характеристики

Безопасность

  • Руководство по безопасному кодированию
  • Руководство по безопасности

Виртуальная машина HotSpot

  • Руководство по виртуальной машине Java
  • Настройка сборки мусора

Управление и устранение неполадок

  • Руководство по устранению неполадок
  • Руководство по мониторингу и управлению
  • Руководство по JMX

Client Technologies

  • Руководство по специальным возможностям Java

Документация JDK 20 — Главная