Múltiples finestres
Un Stage és una finestra. El start() en rep una de creada, la principal, però se’n poden obrir tantes com calgui.
Abans d’obrir-ne una de nova, val la pena preguntar-se si el que vols és una finestra o només un altre contingut. Per canviar tot el que es veu dins de la mateixa finestra n’hi ha prou amb substituir l’arrel del graf:
scene.setRoot(nouContingut); // mateixa finestra, contingut nou
Obrir una finestra nova
Stage finestra = new Stage();
finestra.setTitle("Detall");
finestra.setScene(new Scene(contingut, 300, 200));
finestra.show();
Una finestra pot dependre’n d’una altra i bloquejar-la mentre és oberta. Això es configura amb dos mètodes, que s’han de cridar abans de mostrar-la:
initOwner(Window): diu quina finestra és la propietària. La nova es col·loca al davant i es tanca amb ella.initModality(Modality): diu quines finestres queden bloquejades.
Modality té tres valors:
| Valor | Efecte |
|---|---|
NONE | No bloqueja res. És el valor per defecte |
WINDOW_MODAL | Bloqueja la finestra propietària i els seus ancestres |
APPLICATION_MODAL | Bloqueja totes les finestres de l’aplicació |
show() obre la finestra i retorna immediatament. showAndWait() l’obre i atura l’execució fins que es tanca, que és el que normalment vols en una finestra modal:
Stage dialeg = new Stage();
dialeg.initOwner(primaryStage);
dialeg.initModality(Modality.APPLICATION_MODAL);
dialeg.setScene(new Scene(contingut));
dialeg.showAndWait(); // continua aquí quan es tanqui
showAndWait() no es pot cridar des de qualsevol lloc: ha de ser al JavaFX Application Thread, i no dins d’un init() ni d’un altre fil.
Diàlegs preparats
Per a les converses curtes no cal muntar un Stage. JavaFX porta tres diàlegs fets, tots modals i tots amb showAndWait():
Alert informa o demana confirmació. El tipus decideix la icona i els botons:
Alert alerta = new Alert(Alert.AlertType.CONFIRMATION, "Vols esborrar el registre?");
alerta.showAndWait()
.filter(resposta -> resposta == ButtonType.OK)
.ifPresent(resposta -> esborra());
TextInputDialog demana un text i ChoiceDialog demana una opció d’una llista:
TextInputDialog dialeg = new TextInputDialog("sense nom");
dialeg.setHeaderText("Com es diu el fitxer?");
Optional<String> nom = dialeg.showAndWait();
Tots tres retornen un Optional, que és buit si l’usuari tanca el diàleg sense triar. Per això el codi es llegeix amb ifPresent() o orElse(), i mai s’assumeix que hi ha resposta.