finestreAggiuntive

aprire ed utilizzare altre finestre

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

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().