10-intro-java-fx
10-intro-java-fx
Angelo Di Iorio
Università di Bologna
Graphical User Interface - GUI
• Il termine Graphical User Interface (GUI) indica la parte
di un programma che interagisce con l’utente, attraverso
elementi grafici quali finestre, bottoni, menù, etc.
• Terminologia di uso comune e molto diffusa:
• Finestra (Window)
• Pannello (Panel)
• Menù (Menu)
• Pulsante (Button)
• Etichetta (Label)
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");
primaryStage.show();
}
http://diiorio.nws.cs.unibo.it/asd1819/java/gui/
Java FX Application e Stage
• Un’applicazione JavaFX estende la classe
javafx.application.Application
• La classe espone un metodo astratto eseguito al lancio
dell’applicazione:
public void start(Stage primaryStage)
g.getChildren().add(r1);
g.getChildren().add(c1);
primaryStage.setScene(s1);
primaryStage.show();
}
Colori
• La classe Color è usata per esprimere colori nello spazio
RGB (Red Green Blue)
• Un colore può avere anche un valore alpha per indicare la
trasparenza (da 0 a 1, default 1 nessuna trasparenza)
• Diversi costruttori per esprimere lo stesso colore:
• Costanti: Color.RED, Color.BLUE, Color.ACQUAMARINE,
Color.OLIVE, etc.
• Codice RBG interi: Color.rgb(0,122,122)
• Codice RGB esadecimali: Color.web(”0000FF”)
• …
g.getChildren().add(r1);
g.getChildren().add(c1);
…
Testi
• La classe Text definisce un nodo che contiene appunto
testo
• Come per le forme (e per tutti i nodi) per aggiungere un
testo alla GUI:
• Istanziare un oggetto della classe, settando eventualmente anche
la posizione
• Settare le proprietà del testo
• Colore
• Font
• Effetti
• …
• Aggiunge il nodo ad un gruppo/layout
Forme 2D
• Scrivere un’applicazione HelloWorldText per ottenere
la seguente visualizzazione
• Posizione, colori e stili esatti non sono rilevanti
Testi
Text t1 = new Text(50, 50, "Orange");
t1.setFont(Font.font("verdana", FontWeight.BOLD, 60));
t1.setFill(Color.YELLOW);
t1.setStroke(Color.RED);
t1.setStrokeWidth(4);
FileInputStream streamPicture2 =
new FileInputStream("src/gui/fx/scacchi.jpg");
ImageView picture2View = new ImageView(new
Image(streamPicture2));
// omessi add() a gruppo o layout
Layouts
• Dopo aver costruito i nodi è necessario disporli nello spazio.
Java FX fornisce diversi layout predefiniti per organizzare in
modo flessibile i nodi all’interno della scena
• https://docs.oracle.com/javafx/2/layout/builtin_layouts.htm
sp.getChildren().addAll(background, l);
root.getChildren().add(sp);
}
root.setAlignment(Pos.CENTER);
… // add() di root alla scena omesso (vedi predencenti)
Comportamenti dinamici
• Aggiungere questo comportamento dinamico all’esempio
precedente:
• puntando su un elemento lo sfondo diventa rosso
• spostando il puntatore fuori dall’elemento lo sfondo torna bianco
Eventi in Java FX
• In JavaFX un evento è un istanza della classe
javafx.event.Event o qualunque sottoclasse di Event.
• Ogni evento è caratterizzato da tre proprietà:
• Type: il tipo di evento, secondo una gerarchia pre-definita ed
estensibile
• Source: origine dell’evento, può cambiare mentre l’evento viene
“processato”
• Target: nodo su cui l’azione è avvenuta; se ci sono più nodi annidati si
considera il nodo più in profondità della gerachia (e/o nel layer più
alto)
Tipi di eventi
Processare un evento
• La gestione di un evento prevede 4 fasi:
• Target selection: identificazione del nodo su cui è avvenuto
l’evento in base al tipo di evento
• Route construction: costruzione del percorso dalla radice al
nodo (dispatch chain)
• Event Capturing: propagazione dell’evento dalla radice al
target, eseguendo eventuali filtri registrati per gestire
quell’evento
• Event Bubbling: propagazione dell’evento dalla radice al
target, eseguendo eventuali handler registrati per gestire
quell’evento
Processare un evento
Event Handler
• Per processare un evento un node deve registrare un
EventHandler, che implementa l’interfaccia
EventHandler ed è associato ad un dato evento
• Il metodo principale dell’interfaccia è handle() che
contiene il codice che sarà eseguito quando il nodo che ha
registrato l’handler riceve l’evento
• metodi setOn<EVENT>
sp.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent arg0)
{
background.setFill(Color.RED);
}
}); Registrazione
EventHandler
sp.addEventHandler(MouseEvent.MOUSE_EXITED, new
EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent arg0) {
background.setFill(Color.WHITE);
}
});
Un punto importante
• I nodi da modificare negli handler devono essere variabili
final
<Button
layoutX="172.0"
layoutY="45.0”
prefWidth="200.0”
text="Say hello!”
styleClass="btn, btn-primary”
fx:id="sayHelloActionTarget"/>
http://gluonhq.com/products/scene-builder/