Invio in una TextField
A volte non è necessario avere un pulsante, ci basta che quando l'utente preme invio in un campo di testo il programma esegua l'azione: basta legare l'evento azione alla casella stessa!
casellaDiTesto.setOnAction(e->azione());
Comunicare un messaggio all'utente
Quando non basta scrivere un avviso in una etichetta possiamo aprire una finestra per comunicare un messaggio all'utente:
Alert dialogoAllerta = new Alert(AlertType.CONFIRMATION, "Sei sicuro che vuoi formattare il sistema?"); Optional<ButtonType> risposta = dialogoAllerta.showAndWait(); if(risposta.isPresent() && risposta.get() == ButtonType.OK) { eRisposta.setText("Neanche per scherzo!"); }
Abbiamo usato in tutto tre oggetti: Alert
che serve a creare la finestra di dialogo e
-
javafx.scene.control.Alert
è l'oggetto che rapresenta la finestra di dialogo -
javafx.scene.control.Alert.AlertType
contiene diverse costanti per specificare il tipo di messaggio -
java.util.Optional<>
è un tipo parametrico che può contenere o meno un valore (da cui "Optional"). Nel caso delle finestre di dialogo potrebbe succedere che l'utente chiude la finestra senza premere OK.
Chiedere un dato all'utente bloccando il programma
Se serve di dover chiedere un dato all'utente in una finestra separata si può usare un frammento di codice come il seguente:
TextInputDialog dialogoInput = new TextInputDialog(); dialogoInput.setTitle("Tokyo"); dialogoInput.setHeaderText("Gruppo viaggio"); dialogoInput.setContentText("quante persone in totale?"); Optional<String> risposta = dialogoInput.showAndWait(); if(risposta.isPresent()){ eRisposta.setText("persone: "+risposta.get()); }
Come comportamento predefinito la finestra mostra una icona con un "?"
ma se questo non fosse accettabile per noi possiamo eliminarlo utilizzando
dialogoInput.setGraphic(null)
oppure visualizzare un'altra immagine...
con il frammento di codice qui sotto prendiamo una immagine situata nel pacchetto
"immagini" (il percorso inizia con "/" ed è relativo all'inizio
della gerarchia dei pacchetti).
ImageView iv = new ImageView("/immagini/foto.jpg"); dialogoInput.setGraphic(iv);
Chiedere un nome di file
La classe javafx.stage.FileChooser
è quello che ci serve:
FileChooser selettoreFile = new FileChooser(); String cartellaPartenza = System.getProperties().getProperty("user.home"); selettoreFile.setInitialDirectory(new File(cartellaPartenza)); selettoreFile.getExtensionFilters().addAll(new ExtensionFilter("File html", "*.html")); File fileSelezionato = selettoreFile.showOpenDialog( finestra );
Qui abbiamo usato anche System.getProperties().getProperty("user.home");
per trovare la cartella home dell'utente che sta usando il programma (ci sono
altre proprietà) e
javafx.stage.FileChooser.ExtensionFilter
per permettere all'utente di selezionare soltanto alcuni files.
Qui il problema è la variabile finestra
che deve essere passata a showopenDialog()
:
la cosa più facile da fare è dichiarare al livello di classe javafx.stage.Window finestra;
e poi mettere nella funzione
start()
finestra = primaryStage;
perché javafx.stage.Window
è la superclasse di javafx.stage.Stage
(in effetti è possibile anche utilizzare una soluzione decisamente sbrigativa: passare null
come argmento di showOpenDialog
in questo caso sarebbe però opportuno
leggere la documentazione)
Aprire una seconda finestra
L'oggetto che rappresenta la finestra in javafx è Window, noi useremo una sua subclasse che è Stage (stesso tipo dello stage primario che viene creato dal sistema all'avvio dell'applicazione).
Vale qui come in tutti i casi che si lavorano con javafx: tutte le operazioni con gli oggetti appartenenti a questa libreria vanno fatte nel Thread di JavaFX (va bene aprire la finestra in un metodo che gestisce un evento).
import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class SecondaFinestra extends Stage{ public SecondaFinestra(){ Label testo = new Label("finestra aperta"); Scene scene = new Scene(new BorderPane(testo),200,100); setTitle("Seconda finestra!"); setScene(scene); } }
Per aprire la finestra serve un frammento di codice come questo:
SecondaFinestra finestra = new SecondaFinestra(); finestra.show();
Nell'esempio la seconda finestra viene aperta e il metodo che l'ha aperta continua
ad andare avanti, se si volesse attendere la chiusura della finestra per proseguire bisognerebbe
usare showAndWait()
al posto di show()
.
Per impedire che l'utente interagista con la prima finestra prima di aver chiuso la seconda
bisogna chiamare initModality(Modality.APPLICATION_MODAL)
prima di usare
show()
o showAndWait()
.