2016-06-09 2 views
0

На этапе JavaFX я хочу проверить ввод пользователя, когда фокус покидает текстовое поле. Если пользовательский ввод не является допустимым возрастом (от 0 до 120), то отображается Dialog using ControlsFX Dialogs с сообщением об ошибке.Javafx создает диалог по потерянному фокусу сбой приложения при закрытии окна

Вот код:

participantAgeTextField.focusedProperty() 
         .addListener(new ChangeListener<Boolean>() { 
     @Override 
     public void changed(ObservableValue<? extends Boolean> ov, 
          Boolean oldPropertyValue, Boolean newPropertyValue) 
     { 
      if(!newPropertyValue) { // lost focus 
       if(!participantAgeTextField.getText().isEmpty()) { 
        if (participantAgeTextField.getText().matches("^\\d+$")) { 
         int val = Integer. 
            parseInt(participantAgeTextField.getText()); 
         if(val <= 0) { 
          val = 1; 
         } else if(val > 120) { 
          val = 120; 
         } 
         participantAgeTextField.setText(""+val); 
        } else { 
         participantAgeTextField.setText(""); 
         Dialogs.create() 
          .owner(null) 
          .title("Error") 
          .masthead(null) 
          .message("You must enter a valid age!") 
          .showError(); 
        } 
       } 
      } 
     } 
    }); 

Это работает отлично, за исключением того, когда пользователь вводит недопустимое значение, а затем пытается закрыть окно, нажав на кнопку «X» в правом верхнем углу окна (сцена).

В этом случае приложение «зависает». (Как ни странно, только в Windows это не происходит в Linux).

Я искал исправление, например, не отображая сообщение, когда фокус меняется на «X» окна. Однако я не нашел способа обнаружить это.

Другие идеи, как исправить это, будем очень благодарны!

Джорис

EDIT Возможно ControlsFX вызывает сбой. Я не могу использовать диалоги JavaFX (введенные в 8u40), потому что я использую Javafx 8u25. Любые альтернативы приветствуются!

EDIT 2 Аварии можно избежать, если использовать ControlsFX Диалоги но создает сообщение об ошибке «вручную», как предложено DVarga. Но это приводит к появлению сообщения об ошибке после закрытия окна. Любые идеи о том, как предотвратить это?

+0

Вы пробовали со стандартным JavaFX 'Alert'? \t 'Предупреждающее предупреждение = новое предупреждение (AlertType.ERROR); alert.setContentText («Вы должны ввести действительный возраст!»); alert.setTitle ("Ошибка"); alert.showAndWait(); ' – DVarga

+0

Хорошее предложение, но, к сожалению, я связан с JavaFX 8u25 (устаревший код), и Alert был введен в 8u40. – DeBaze

+0

А, я вижу редактирование сейчас;) – DVarga

ответ

0

Я думаю, что будет обойти аварии следующим образом:

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