2014-12-17 3 views
5

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

dlg.setResultConverter(dialogButton -> { 

    if (dialogButton == createButtonType) { 

     ArrayList<String> returnList = getInput(); 

     if (returnList != null) { 
      return returnList; 
     } 
     else { 
      dlg.showAndWait(); 
     } 

    } 
    return null; 
}); 

Optional<ArrayList<String>> result = dlg.showAndWait(); 
result.ifPresent(customerDetails -> { 

    //Use the input for something 

}); 

Метод getInput() получает текст из TextFields и испытаний его от некоторых требований. Когда вход проходит, четыре строки помещаются в ArrayList<String>. Else, метод возвращает null. Как вы можете видеть, конвертер результатов проверяет, вернулся ли метод null. Если это не так, он просто возвращает ArrayList<String>.

Но, когда проверка не удалась, диалог должен оставаться открытым. Он работает с dlg.showAndWait(), но недостатком является то, что он вызывает ошибку: java.lang.IllegalStateException: Stage already visible. (он продолжает работать, но получение ошибки не так, как должно быть)

Мой вопрос: кто-нибудь знает, как это сделать, без возникновения ошибки?

. Примечание: Я использую JavaFX 8 (JDK 1.8.0_40), который имеет диалоговые функции, встроенные в

ответ

5

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

Если пользовательский ввод действителен, включите «ОК» Button (или как его название), если вход пользователя недействителен, отключите Button.

Если Button для закрытия Dialog отключен, единственным способом закрыть Dialog это отменить, что приводит к пустому Optional как результат.

+0

Спасибо за ваш ответ! Означает ли это, что это невозможно в конверторе результатов? – bashoogzaad

+0

Преобразователь результата предназначен для преобразования результата. Так что вполне возможно, что слишком поздно, чтобы предотвратить закрытие диалога ;-) – eckig

+0

Вы также можете подключить ActionListener на кнопке ok, чтобы использовать событие, когда вход недействителен. – tomsontom

15
final Button okButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK); 
okButton.addEventFilter(ActionEvent.ACTION, ae -> { 
    if (!isValid()) { 
     ae.consume(); //not valid 
    } 
}); 

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

BTW описан в official docs.

0

Предположим, что диалог с TextField и кнопка Ok.

Кнопка отключена для начала и включена при вводе действительных данных в TextField (текст длиной от 5 до 25 символов). ChangeListener, привязанный к StringProperty от TextField, управляет состоянием/отключением кнопки.

TextField textFld = new TextField(); 
... 
ButtonType buttonTypeOk = new ButtonType("Okay", ButtonData.OK_DONE); 
dialog.getDialogPane().getButtonTypes().add(buttonTypeOk); 
final Button okButton = (Button) dialog.getDialogPane().lookupButton(buttonTypeOk); 
okButton.setDisable(true); 
textFld.textProperty().addListener((observable, oldValue, newValue) -> { 
    okButton.setDisable(newValue.trim().length() < 5 || newValue.trim().length() > 25); 
}); 
Смежные вопросы