Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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:

ValorEfecte
NONENo bloqueja res. És el valor per defecte
WINDOW_MODALBloqueja la finestra propietària i els seus ancestres
APPLICATION_MODALBloqueja 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.

Referències

Last change: , commit: 0ee48c2