2014-12-17 11 views
5

Mam obecnie okno dialogowe z czterema polami tekstowymi, z których pobierane jest dane wejściowe. Kiedy wejście nie spełnia moich wymagań, okno dialogowe powinno pozostać otwarte i pokazać komunikat o błędzie. Obecnie mam następujący kod:Wyświetlaj okno dialogowe, gdy sprawdzanie poprawności wejścia zakończy się niepowodzeniem.

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 

}); 

Sposób getInput() pobiera tekst z pól tekstowych oraz testów go przed niektórymi wymaganiami. Kiedy dane wejściowe mijają, cztery ciągi są umieszczane w ArrayList<String>. Inaczej metoda zwraca null. Jak widać, konwerter wyników sprawdza, czy metoda zwróciła null. Jeśli nie, po prostu zwraca ArrayList<String>.

Jednak, gdy sprawdzanie poprawności nie powiedzie się, okno dialogowe powinno pozostać otwarte. Działa z dlg.showAndWait(), ale wadą jest to, że uruchamia błąd: java.lang.IllegalStateException: Stage already visible. (nadal działa, ale błąd jest inny niż powinien).

Moje pytanie brzmi: czy ktoś wie, jak to zrobić, nie powodując błędu?

. Uwaga: Używam JavaFX 8 (JDK 1.8.0_40), który ma cechy dialogowych zbudowany w

Odpowiedz

5

Dodaj słuchaczy do TextField s, walidacji danych wprowadzanych przez użytkownika.

Jeśli dane wejściowe użytkownika są poprawne, należy włączyć opcję "OK" Button (lub jakakolwiek jest jej nazwa), jeśli dane wejściowe użytkownika są nieprawidłowe, wyłączyć Button.

Jeśli Button zamknięcia Dialog jest wyłączona, jedynym sposobem, aby zamknąć Dialog jest do odwołania, co skutkuje w pustym Optional jako wynik.

+0

Dzięki za odpowiedź! Czy to oznacza, że ​​nie jest to możliwe z konwerterem wyników? – bashoogzaad

+0

Konwerter wyników służy do przekonwertowania wyniku. Jest więc całkiem możliwe, że za późno, aby nie dopuścić do zamknięcia okna dialogowego ;-) – eckig

+0

Możesz także dołączyć ActionListener na przycisku ok, aby zużywać zdarzenie, gdy dane wejściowe są nieprawidłowe. – tomsontom

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

Działa dobrze dla mnie. Po prostu użyj filtru, gdy wystrzeli pierwszy. Jest to opisane w official docs.

0

Załóżmy okno dialogowe z tekstem i przyciskiem OK.

Przycisk jest wyłączony i jest włączony przy wprowadzaniu poprawnych danych w polu TextField (tekst o długości od 5 do 25 znaków). ChangeListener dołączony do StringProperty TextField kontroluje stan włączony/wyłączony przycisku.

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); 
}); 
Powiązane problemy