GXT KeyListener.comComponentKeyDown() немедленно закрывает MessageBox.alert()
-
22-08-2019 - |
Вопрос
В GXT, MessageBox
методы являются асинхронными, что означает, что приложение не «блокируется», пока отображается окно сообщения.
я использую KeyListener
для обработки нажатия клавиши ввода в форме (чтобы повысить удобство использования, т. е. разрешить отправку формы с помощью клавиши ввода) и последующего отключения полей формы, пока приложение обрабатывает учетные данные пользователя.Если они неверны, я показываю MessageBox.alert()
а затем снова включите поля формы.Однако, поскольку alert()
возвращается немедленно, поля формы немедленно снова становятся доступными, что позволяет пользователю вводить данные, не закрывая оповещение.
Решение состоит в том, чтобы использовать обратный вызов в alert()
;однако нажатие клавиши ввода не только приводит к отправке формы, но также приводит к немедленному закрытию предупреждения (как если бы и форма, и окно сообщения обрабатывали клавишу ввода).Как оставить окно предупреждения открытым до тех пор, пока пользователь не нажмет кнопку «Ввод» второй раз или не нажмет кнопку «ОК»?
Решение
Ключ DeferredCommand
предоставлено ГВТ:
Этот класс позволяет выполнять код после завершения всех ожидающих в данный момент обработчиков событий, используя метод
addCommand(Command)
илиaddCommand(IncrementalCommand)
методы.Это полезно, когда вам нужно выполнить код вне контекста текущего стека.
if(!validate())
{
DeferredCommand.addCommand(new Command() {
public void execute() {
MessageBox.alert("Error", "You must enter a username and password.", alertListener);
return;
}
});
}