Académique Documents
Professionnel Documents
Culture Documents
Ahcène Bounceur
JavaFX
• Bibliothèque Graphique
• Intégrée dans JRE et JDK
• Permet de réaliser des interfaces graphiques
évoluées :
– Animations
– Effets
– 3D
– Audio
– Vidéo
JavaFX
JavaFX
8
@Override
public void start(Stage estrade) {
}
Premier exemple
import javafx.application.Application;
import javafx.stage.Stage;
@Override
public void start(Stage estrade) {
System.out.println("Bonjour");
}
Scene
Node
L’estrade : Stage
L’estrade : Stage
• javafx.stage.Stage
• Equivalent de Frame (AWT) ou JFrame (Swing)
• Permet de :
– Définir la taille de la fenêtre
– Définir le titre de la fenêtre
@Override
public void start(Stage stage) {
}
La Scène : Scene
La Scène : Scene
• javafx.scene.Scene
• Décor où l’on placera les différents instruments,
décoration, lumières, etc.
Les nœuds : Node
Les nœuds : Node
• javafx.scene.Node
• Node : instruments, décoration, lumières,
musiciens, comédiens, etc.
Les nœuds : Node
• javafx.scene.Canvas
• javafx.scene.ImageView
• javafx.scene.MediaView
• javafx.scene.Parent
• javafx.scene.Shape
• javafx.scene.Panel
• javafx.scene.Button
• javafx.scene.Label
MA PREMIÈRE FENÊTRE
Ma première fenêtre
import javafx.application.Application;
import javafx.stage.Stage;
@Override
public void start(Stage estrade) {
}
MÉTHODE 1 :
PROGRAMMATION DIRECTE
Ma première fenêtre
@Override
public void start(Stage estrade) {
}
Ma première fenêtre
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
estrade.setWidth(600);
estrade.setHeight(400);
estrade.show();
}
Ma première fenêtre
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
estrade.setWidth(600);
estrade.setHeight(400);
Pane panneau = new Pane();
Button bouton = new Button("Un Bouton");
bouton.setLayoutX(255); bouton.setLayoutY(187);
panneau.getChildren().add(bouton);
estrade.show();
}
Ma première fenêtre
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
estrade.setWidth(600);
estrade.setHeight(400);
Pane panneau = new Pane();
Button bouton = new Button("Un Bouton");
bouton.setLayoutX(255); bouton.setLayoutY(187);
panneau.getChildren().add(bouton);
Scene scene = new Scene(panneau);
estrade.setScene(scene);
estrade.show();
}
Ma première fenêtre
Stage
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
Node
estrade.setWidth(600);
estrade.setHeight(400);
Pane panneau = new Pane();
Button bouton = new Button("Un Bouton");
Scene
bouton.setLayoutX(255); bouton.setLayoutY(187);
panneau.getChildren().add(bouton);
Scene scene = new Scene(panneau);
// Action du bouton
Op#on 1 : Lambda Expression
estrade.setScene(scene); bouton.setOnAction(new EventHandler<ActionEvent>() {
estrade.show(); @Override
public void handle(ActionEvent event) {
} System.out.println("Hello World!");
}
});
MÉTHODE 2 : SCENE BUILDER
(ACTION PAR LAMBDA
EXPRESSION)
Ma première fenêtre
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
Scene Builder
estrade.setWidth(600);
estrade.setHeight(400);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MonAppli.class.getResource("fenetre.fxml"));
Pane panneau = (Pane) loader.load();
<?import javafx.scene.shape.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?> Scene Builder
<?import javafx.scene.layout.*?>
( 6 0 0);
t W i dth (400);
<Pane
a d e .se Height
t
maxHeight="-Infinity" estr ade.se
maxWidth="-Infinity"
estr
minHeight="-Infinity"
minWidth="-Infinity"
prefHeight="400.0" pann
eau.
prefWidth="600.0" getC
hild
xmlns="http://javafx.com/javafx/8" r e n(
).ge
xmlns:fx="http://javafx.com/fxml/1"> t(0)
;
<children>
<Button layoutX="255.0" layoutY="187.0" mnemonicParsing="false" text="Mon Button" />
</children>
</Pane> tLayout Y( 1 8 7 ) ;
55); b outon.se
y o u t X( 2
bout on.setLa
MÉTHODE 3 : SCENE BUILDER
(ACTION PAR RÉFÉRENCEMENT
DE MÉTHODE)
Ma première fenêtre
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
Scene Builder
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MonAppli.class.getResource("fenetre.fxml"));
Pane panneau = (Pane) loader.load();
Button bouton = (Button) panneau.getChildren().get(0) ;
bouton.setOnAction(this::afficher);
Scene scene = new Scene(panneau);
estrade.setScene(scene);
estrade.show();
}
@FXML
private void afficher(ActionEvent event) {
System.out.println("Bonjour");
}
MÉTHODE 4 : SCENE BUILDER
(MVC)
Ma première fenêtre
@Override
public void start(Stage estrade) {
estrade.setTitle("Ma première fenêtre");
Scene Builder
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MonAppli.class.getResource("fenetre.fxml"));
Pane panneau = (Pane) loader.load();
Scene scene = new Scene(panneau);
estrade.setScene(scene);
estrade.show();
}
M
Ma première fenêtre
public class MonControleur {
@FXML
Scene Builder
private void afficher(ActionEvent event) {
System.out.println("Bonjour");
}
}
C
Ma première fenêtre
public class MonControleur implements Initializable {
@FXML
private void afficher(ActionEvent event) {
System.out.println("Bonjour");
}
@Override
public void initialize(URL location, ResourceBundle resources) {
}
}
C
Ma première fenêtre
public class MonControleur implements Initializable {
@FXML
private ComboBox<String> comboBox;
@Override
public void initialize(URL location, ResourceBundle resources) {
comboBox.getItems().removeAll(comboBox.getItems());
comboBox.getItems().addAll("A", "B", "C");
comboBox.getSelectionModel().select("A");
}
Bo x
}
o mbo
n C
C
lis e r u
a
Ini0
Ma première fenêtre
public class MonControleur implements Initializable {
@FXML
private StackPane pane;
@Override
public void initialize(URL location, ResourceBundle resources) {
SwingNode sn = new SwingNode();
JButton bouton = new JButton("OK");
sn.setContent(bouton);
pane.getChildren().add(sn);
w in g
} S ud
N œ
C
}
iser u n
al
Ini0
Ma première fenêtre Scene Builder
2
1
V
SCENE BUILDER : EXEMPLE
1. Création du projet Java
• Créer un projet JavaFx
• Nommer la classe principale Somme.java
public class Somme extends Application {
@Override
public void start(Stage estrade) throws IOException {
estrade.setTitle("Somme");
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Somme.class.getResource("exemple.fxml"));
BorderPane panneau = (BorderPane) loader.load();
Scene scene = new Scene(panneau);
estrade.setScene(scene);
estrade.show();
}
public static void main(String[] args) {
launch(args);
}
}
2. Dessiner votre IHM J
2. Dessiner votre IHM J
3. Affecter les IDs
• Affecter les IDs à tous les composants qui seront
utilisés dans votre programme
• Dans l’exemple :
– Champ A (TextField : aTextField)
• Pour récupérer la valeur de A
– Champ B (TextField : bTextFiel)
• Pour récupérer la valeur de B
– Label Somme (Label : sommeLabel)
• Pour afficher la somme de A+B
3. Affecter les IDs
4. Créer le contrôleur
public class SommeControleur {
@FXML
private TextField aTextField;
@FXML
private TextField bTextField;
@FXML
private Label sommeLabel;
@FXML
private void somme() {
int x = Integer.parseInt(aTextField.getText());
int y = Integer.parseInt(bTextField.getText());
int z = x + y ;
sommeLabel.setText("Somme = "+z);
}
}
5. Affecter le contrôleur à l’IHM
6. Affecter les actions des boutons
7. Sauvegardez, Rafraichissez &
Exécutez
SCENE BUILDER :
L’INTERFACE
1. Menu
5. Composants graphiques
4.
Propriétés
Layout et Code
3. Hiérarchie
& Contrôleur
Content Display
– Avec un style :
4.1. Les propriétés
• Soit en utilisant les styles intégrés (Style)
– Avec un style :
4.1. Les propriétés
-fx-font-size
4.1. Les propriétés
• Extras :
4.2 Le Layout
• Alignment
• Margin
• Padding
• Spacing
• Vgap
• Hgap
4.2 Le Layout
• Alignment
– Tous les objets du layout seront alignés soit de
gauche à droit, soit de droite à gauche, soit au centre
4.2 Le Layout
• Margin
– Concerne les marges externes du composant
Padding du bouton
4.2 Le Layout
• Margin & Padding
Hbox (layout)
Margin Padding
4.2 Le Layout
• Dimensions :
– Largeur (Pref Width)
– Longueur (Pref Height)
4.2 Le Layout
• Position du composant dans son layout
79
158
4.2 Le Layout
• Transformation : Il est possible modifier la
rotation (tourner) d’un composant en 2D et en
3D
Degrés
Propor8on
Zoom
Transla8on
4.2 Le Layout
4.3 Code
1. U8lisez le même nom des IDs dans le contrôleur !
2. De préférence, meHez tous les noms dans le contrôleurs, ensuite les choisir dans Scene
Builder
public class SommeControleur {
@FXML
private TextField aTextField;
@FXML
private TextField bTextField;
@FXML
private Label sommeLabel;
}
4.3 Code
• Des parties peuvent s’afficher spécifiquement
pour chaque composants
– Main (OnAction) pour le cas d’un bouton
– Edit et Closing pour le cas d’un TabedPane
– …
4.3 Code
@FXML
private void afficher(KeyEvent evt) {
System.out.print(evt.getText());
}
4.3 Code
@FXML
private void afficher(MouseEvent evt) {
System.out.println(evt.getX()+" "+evt.getY());
}
4.3 Code
5. Les composants graphiques
5. Les composants graphiques
• Label
5. Les composants graphiques
• Pane, StackPane, BorderPane, AnchorPane,
GridPane
5. Les composants graphiques
• TextField
5. Les composants graphiques
• ProgressBar
5. Les composants graphiques
• SplitPane
– Divider Position : de 0 à 1 (%)
5. Les composants graphiques
• ComboBox/ListBox : initialisation
@FXML
private ComboBox<String> comboBox;
@Override
public void initialize(URL location, ResourceBundle resources) {
comboBox.getItems().removeAll(comboBox.getItems());
comboBox.getItems().addAll("A", "B", "C");
comboBox.getSelectionModel().select("A");
}
}
5. Les composants graphiques
• ComboBox/ListBox : initialisation
@FXML
private ComboBox<ObjectModel> comboBox;
@Override
public void initialize(URL location, ResourceBundle resources) {
comboBox.getItems().removeAll(comboBox.getItems());
comboBox.getItems().addAll("A", "B", "C");
comboBox.getSelectionModel().select("A");
}
}
Menus
• Menu
• Sous menu
• Séparateur
• Menu (radio et radio group)
• Raccourcis
COMPLÉMENT
Boites de dialogue
A par:r de JDK 8u40
alert.setTitle("Information");
alert.setHeaderText("Portes");
alert.setContentText("Verrouillage enfant activé!");
alert.showAndWait();
Boites de dialogue
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Information");
alert.setHeaderText(null);
alert.setContentText("Verrouillage enfant activé!");
alert.showAndWait();
Boites de dialogue
Alert alert = new Alert(AlertType.WARNING);
Alert alert = new Alert(AlertType.ERROR);
Boites de dialogue
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog");
alert.setHeaderText("Look, a Confirmation Dialog");
alert.setContentText("Are you ok with this?");
} else {
}
Boites de dialogue
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog with Custom Actions");
alert.setHeaderText("Look, a Confirmation Dialog with Custom Actions");
alert.setContentText("Choose your option.");
th.start();
Tâches/Thread
Lancer un thread :
Platform.runLater(new Runnable() {
@Override
public void run() {
...
}
});
Tâches/Thread
Lancer une tâche :
new Thread(task).start();
Tâches/Thread
Lancer une tâche :
new Thread(task).start();
Tâches/Thread
Lancer une tâche :
new Thread(task).start();
Mise à jour d’une propriété
Lancer une tâche : @FX
M
pub L
lic
Pro
Task task = new Task<Void>() { gre
ssB
ar
@Override pro
gre
ss;
public Void call() {
for (int i=0; i<=10000; i++) {
updateProgress(i, 10000);
}
return null;
}
};
progress.progressProperty().bind(task.progressProperty());
new Thread(task).start();
Mise à jour d’une propriété
Lancer une tâche : @FX
M
pub L
lic
Pro
Task task = new Task<Void>() { gre
ssB
ar
@Override pro
gre
ss;
public Void call() {
for (int i=0; i<=10000; i++) {
updateProgress(i, 10000);
}
return null;
}
};
progress.progressProperty().bind(task.progressProperty());
new Thread(task).start();
Fichiers (FileChooser)
Ouvrir un fichier
fileChooser.setTitle("Open file");
File file = fileChooser.showOpenDialog(stage);
Fichiers (FileChooser)
Ouvrir un fichier avec spécification des extensions :
Stage stage = new Stage();
fileChooser.setTitle("Open file");
fileChooser.getExtensionFilters().add(
new FileChooser.ExtensionFilter("JPG", "*.jpg")
);
fileChooser.setTitle("Open file");
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("JPG", "*.jpg"),
new FileChooser.ExtensionFilter("PNG", "*.png"),
);
fileChooser.setTitle("Save file");
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("JPG", "*.jpg"),
new FileChooser.ExtensionFilter("PNG", "*.png"),
);
dir.setTitle("Dossier");
}
});
Sous fenêtre (modale)
• Faire de même pour la fenêtre principale et :