2014-12-17 3 views
5

Attualmente ho una finestra di dialogo con quattro campi di testo da cui viene raccolto l'input. Quando l'input non può soddisfare i miei requisiti, la finestra di dialogo dovrebbe rimanere aperta e mostrare un messaggio di errore. Al momento ho il seguente codice:Continua a mostrare una finestra di dialogo quando la convalida dell'input fallisce

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 

}); 

Il metodo getInput() ottiene il testo dai campi di testo e delle prove cui nei confronti di alcuni requisiti. Quando l'input passa, le quattro stringhe vengono inserite in un ArrayList<String>. Altrimenti, il metodo restituisce null. Come puoi vedere, il convertitore di risultati verifica se il metodo ha restituito null. In caso contrario, restituisce semplicemente lo ArrayList<String>.

Tuttavia, quando la convalida non riesce, la finestra di dialogo deve essere mantenuta aperta. Funziona con dlg.showAndWait(), ma il lato negativo è che genera un errore: java.lang.IllegalStateException: Stage already visible. (continua a funzionare, ma ottenere un errore non è come dovrebbe essere)

La mia domanda è: qualcuno sa come fare questo, senza innescare un errore?

. Nota: Sto usando JavaFX 8 (JDK 1.8.0_40), che ha le caratteristiche di dialogo costruito in

risposta

5

Aggiungi ai tuoi ascoltatori TextField s, convalidando l'input dell'utente.

Se l'immissione utente è valida, abilitare "OK" Button (o qualunque sia il suo nome) se l'input dell'utente non è valido, disabilitare Button.

Se il Button di chiusura del Dialog è disattivato, l'unico modo per chiudere il Dialog è annullare, che si traduce in un vuoto Optional come risultato.

+0

Grazie per la risposta! Questo significa che questo non è possibile con il convertitore di risultati? – bashoogzaad

+0

Il convertitore di risultati ha lo scopo di convertire il risultato. Quindi è del tutto possibile troppo tardi per impedire la chiusura della finestra di dialogo ;-) – eckig

+0

È anche possibile collegare un ActionListener sul pulsante ok e consumare l'evento quando l'Input non è valido. – tomsontom

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

Funziona bene per me. Usa semplicemente il filtro mentre scocca per primo.

BTW è descritto in official docs.

0

Assumere una finestra di dialogo con TextField e un pulsante OK.

Il pulsante è disabilitato per iniziare e viene abilitato quando si immettono dati validi nel campo di testo (testo compreso tra 5 e 25 caratteri). Il ChangeListener collegato a StringProperty di TextField controlla lo stato abilitato/disabilitato del pulsante.

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); 
});