Создание модального диалога в GWT - PullRequest
4 голосов
/ 20 августа 2011

Я новичок в GWT и Java, пытаюсь понять, как создать синхронный (модальный) диалог в GWT, но у меня возникли трудности.Класс DialogBox имеет флаг, который говорит:

modal - true, если события клавиатуры и мыши для виджетов, не содержащихся в диалоге, должны игнорироваться

Но это не делает диалог синхронным.

Я прочитал одно предложение, в котором говорилось, что мне нужно поместить код, обрабатывающий данные диалога, введенные пользователем, в обработчик кнопки ОК.Мне это не нравится, потому что оно делает диалог ответственным за отображение данных и их обработку.Это приводит к плохому «разделению интересов» и нарушает «принцип единой ответственности» хорошего дизайна.

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

Если вы вынуждены использовать мою текущую асинхронную модель, мне нужно будет передать дополнительные данные, как описано здесь .Это кажется большой работой для такой общей задачи.Я что-то пропустил?Есть ли другие варианты?

Ответы [ 3 ]

4 голосов
/ 20 августа 2011

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

К сожалению, как вы знаете, JavaScript (GWT) по своей сути асинхронен - ​​в браузере нет кода JS, выполняемого до тех пор, пока пользовательделает что-то, чтобы вызвать событие.Так что это события, на которые мы должны реагировать.

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

Вот как я бы справился с этим:

  • Создайте свой собственный класс модального диалогового окна, оборачивая диалоговое окно GWT, где я буду реализовывать результаты диалога, например: кнопки SAVE / OK / CANCEL.
  • Предоставление события уведомления или обратного вызоваНапример, onDialogExit, где результат диалога / OK / ОТМЕНА / СОХРАНИТЬ / НИЧЕГО будет предоставлен заинтересованной стороне.Когда пользователь выполняет действие (такое как нажатие кнопки), чтобы выйти из диалогового окна, просто вызовите правильное событие.Событие также может возвращать значение, если в результате диалога должны появиться некоторые данные.
  • Обеспечить обратный вызов для события, когда необходимо обрабатывать результаты диалога.

Это очень похоже на ссылку на указатель функции, которую вы упомянули - вы просто пишете свое собственное событие.

0 голосов
/ 16 сентября 2016

Есть лучший способ, чем асинхронный подход.

boolean okPressed = Window.confirm("Your Message Here");

Ваше приложение удерживается до тех пор, пока пользователь не нажмет «ОК» или «Отмена», и вы не сможете обработать возвращенное логическое значение.

К сожалению, вы не можете изменить текст кнопок «ОК» и «Отмена».

0 голосов
/ 20 августа 2011

Проверьте DialogBox. Вы можете использовать один из конструкторов, чтобы сделать его модальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...