FAQ JavaFXConsultez toutes les FAQ

Nombre d'auteurs : 4, nombre de questions : 507, dernière mise à jour : 2 novembre 2016  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur le forum JavaFX de http://java.developpez.com ainsi que l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.


SommaireApplication (22)
précédent sommaire suivant
 

Une application est une classe qui étend la classe javafx.application.Application et qui surcharge ses méthodes init() et start(). Il s'agit du point d’entrée d'un programme en JavaFX.

Voici le code de notre première application :

Code Java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package test; 
  
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
  
public class Main extends Application { 
  
    @Override 
    public void init() throws Exception { 
        super.init();  
        // Faire des initialisations ici. 
    } 
  
    @Override 
    public void start(Stage primaryStage) {          
        // Créer le contenu de la scène ici. 
        // Bouton. 
        final Button button = new Button("Salut le monde !"); 
        button.setOnAction(actionEvent -> System.out.println("Salut le monde !")); 
        // Nœud racine. 
        final StackPane root= new StackPane(); 
        root.getChildren().setAll(button); 
        // Configuration de la scène. 
        final Scene scene = new Scene(root); 
        // Configuration de la fenêtre. 
        primaryStage.setScene(scene); 
        primaryStage.setTitle("Ma première application"); 
        primaryStage.setWidth(350); 
        primaryStage.setHeight(300); 
        primaryStage.show(); 
    } 
  
    public static void main(String[] args) { 
        launch(args); 
    }     
}

Ce qui nous donnera :



Ici, la méthode statique main(), qui est le point d’entrée habituel d'une application Java, appelle la méthode statique launch() de la classe Application. Bien qu'il soit possible de lancer une application JavaFX de cette manière, vous devez cependant éviter de mettre du code dans la méthode main(). En effet, si la méthode main() est bien appelée lorsque vous démarrez une application JavaFX depuis un JAR exécutable ou un lanceur natif, ce n'est pas du tout le cas si vous exécutez votre programme en tant qu'Applet dans une page web ou via le service Java Web Start.

C'est donc la méthode statique launch() de la classe Application qui servira en fait à initialiser une instance de notre classe. Celle-ci se doit d'avoir un constructeur par défaut (pas de constructeur défini) ou un constructeur sans argument public pour pouvoir être chargée ; tout autre constructeur sera ignoré. Si aucun constructeur compatible n'est trouvé, une exception sera levée.

La méthode init() peut être surchargée pour initialiser des connexions réseau ou bases de données ou charger les données ou fichiers contenus dans l'application. Cette méthode n’étant pas invoquée sur le JavaFX Application Thread, il ne faut pas l'utiliser pour construire la scène.

La méthode start() sert à initialiser le contenu de la scène qui sera affichée dans la fenêtre primaryStage. Cette méthode est invoquée sur le JavaFX Application Thread.

Mis à jour le 10 septembre 2014 bouye

Un Stage est littéralement la scène d'une salle de théâtre, une estrade ou encore la piste d'un cirque : il s'agit de l'endroit physique dans lequel votre application va s'afficher. La classe javafx.stage.Stage hérite de la classe javafx.stage.Window. Pour autant, il ne s'agit pas forcément d'une fenêtre au sens d'une fenêtre native de votre système d'exploitation :

  • mode Applet dans un navigateur web : il s'agit de la surface, généralement fixe et non redimensionnable, de l'Applet incluse dans la page web ;
  • mode JAR exécutable, lanceur natif ou Java Web Start : généralement, il s'agit d'une fenêtre redimensionnable et mobile du système d'exploitation disposant des boutons d'action habituels. Il peut aussi s'agir d'une surface fixe et non redimensionnable couvrant toute la surface d'affichage si on passe l'application en mode plein écran ;
  • système embarqué ou mobile : il s'agit généralement d'une surface, fixe et non redimensionnable, couvrant toute la surface affichable (ex. : surface du frame buffer sur Raspberry Pi). Sur certaines plateformes, cette surface peut cependant être amenée à pivoter (ex. : sur tablettes, etc.). Certaines plateformes mobiles (ex: Windows 8.1) supportent également l'affichage de multiples applications sur un même écran, donc l'application peut être amenée à s'afficher sur une surface plus petite que celle de l’écran.

Mis à jour le 15 mars 2015 bouye

Un Preloader, littéralement un préchargeur, est un type particulier d’application qui étend la classe javafx.application.Preloader (classe qui elle-même hérite de javafx.application.Application).

Il s'agit d'une application légère destinée à afficher un écran de chargement (splashscreen), une barre de chargement ou n'importe quoi d'autre qui soit destiné à faire patienter l'utilisateur le temps que l'application principale se lance dans le cas où son démarrage serait long (chargement de beaucoup de données depuis le disque, connexion à un serveur distant, mise à jour, connexion à une base de données, etc.).

Le code suivant vous montre un preloader basique qui se contente d'afficher une barre de progression et de disparaitre juste avant l'affichage de son application mère :

Code Java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MyPreloader extends Preloader { 
  
    private ProgressBar bar; 
    private Stage stage; 
  
    @Override 
    public void start(Stage stage) throws Exception { 
        this.stage = stage; 
        bar = new ProgressBar(); 
        final BorderPane root = new BorderPane(); 
        root.setCenter(bar); 
        final Scene scene = new Scene(root, 300, 150); 
        stage.setScene(scene); 
        stage.show(); 
    } 
  
    @Override 
    public void handleStateChangeNotification(StateChangeNotification stateChangeNotification) { 
        if (stateChangeNotification.getType() == StateChangeNotification.Type.BEFORE_START) { 
            stage.hide(); 
        } 
    } 
  
    @Override 
    public void handleProgressNotification(ProgressNotification progressNotification) { 
        bar.setProgress(progressNotification.getProgress()); 
    } 
}

Cette classe dispose de méthodes qui peuvent être surchargées pour lui permettre de recevoir des notifications quant à l'avancement du chargement de l'application principale et d'agir en fonction.

Le preloader dispose de son propre stage, cependant :
  • mode Applet dans un navigateur web : le preloader partage la même surface d'affichage définie dans la page web que l'application principale ;
  • mode JAR exécutable, lanceur natif ou Java Web Start : le preloader s'affiche dans une fenêtre séparée de celle de l'application principale ;
  • système embarqué ou mobile : le preloader partage la même surface plein écran que l'application principale (ex. : frame buffer sur Raspberry Pi).


Mis à jour le 10 septembre 2014 bouye

Comme nous vous le disions tantôt, il est possible d'utiliser JavaFX depuis un autre langage de programmation que Java.

Par exemple, nous pouvons utiliser JavaScript qui dispose d'un interpréteur, jjs, fourni avec la JVM :

Code JavaScript : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Imports. 
var Scene = Java.type('javafx.scene.Scene') 
var StackPane = Java.type('javafx.scene.layout.StackPane') 
var Button = Java.type('javafx.scene.control.Button') 
  
// Bouton. 
var button = new Button("Salut le monde !"); 
button.onAction = sayHello 
  
// Nœud racine. 
var root = new StackPane() 
root.children.setAll(button); 
  
// Configuration de la fenêtre. 
$STAGE.scene = new Scene(root) 
$STAGE.title = "Ma première application" 
$STAGE.width = 350 
$STAGE.height = 300 
$STAGE.show() 
  
function sayHello(actionEvent) { 
    print("Salut le monde !") 
}

Ce script créera une application identique à celle que nous avons créée plus tôt en Java.



Pour exécuter ce script, il suffit de faire :

Code : Sélectionner tout
jjs -fx Application1st.js

L'argument -fx indique à l’interpréteur jjs qu'il s'agit d'une application JavaFX.

Mis à jour le 15 septembre 2014 bouye

Pour quitter une application JavaFX, il suffit d'invoquer la méthode exit() de la classe utilitaire javafx.application.Platform. Invoquer cette méthode fermera l'application en invoquant sa méthode stop().

Code Java : Sélectionner tout
Platform.exit();

Attention cependant, s'il existe des threads qui ne sont pas deamon, le programme ne se terminera pas pour autant tant que ces derniers existeront.

Cette méthode n'aura pas d'effet si l'application est incluse en tant qu'Applet dans une page Web.

Mis à jour le 22 septembre 2014 bouye

Pour accéder aux services d'hôte d'une application, il suffit d'invoquer la méthode getHostServices() de l'application. Les services d’hôte permettent, entre autres, de connaitre l'emplacement de base d'une application ou d’interagir avec la page web hôte lorsque l'application s’exécute en mode Applet.

Par exemple :

Code Java : Sélectionner tout
final HostServices hostServices = application.getHostServices();

Mis à jour le 1er octobre 2014 bouye

En accédant aux services d'hôte d'une application, il est possible d'invoquer la méthode getCodeBase(). Cette méthode peut retourner l'emplacement du code de l'application, mais le résultat de cet appel varie en fonction du mode d’exécution de l'application :

  • exécution directe des fichiers class - la chaine sera la chaine vide ;
  • JAR exécutable ou lanceur natif - la chaine retournée contient le répertoire contenant le fichier JAR ;
  • Java Web Start - la chaine retournée contient la valeur spécifiée dans le paramètre codebase du fichier JNLP ;
  • Applet - la chaine retournée contient l'URL du site hébergeant l'applet.


Par exemple :

Code Java : Sélectionner tout
final String codebase = application.getHostServices().getCodeBase();

Mis à jour le 1er octobre 2014 bouye

En accédant aux services d'hôte d'une application, il est possible d'invoquer la méthode getDocumentBase(). Cette méthode peut retourner l'emplacement du code de l'application, mais le résultat de cet appel varie en fonction du mode d’exécution de l'application :

  • exécution directe des fichiers class ou JAR exécutable ou lanceur natif - la chaine retournée contient le répertoire de travail de l'application ;
  • Java Web Start - la chaine retournée contient la valeur spécifiée dans le paramètre codebase du fichier JNLP ;
  • Applet - la chaine retournée contient l'URL de la page web hébergeant l'applet.


Par exemple :

Code Java : Sélectionner tout
final String documentbase = application.getHostServices().getDocumentBase();

Mis à jour le 1er octobre 2014 bouye

En accédant aux services d'hôte d'une application, il est possible d'invoquer la méthode getWebContext(). Cette méthode peut retourner un objet permettant d’interagir avec la page web contenant l’application JavaFX, mais le résultat de cet appel varie en fonction du mode d’exécution de l'application :

  • Applet - la méthode retourne un objet de type netscape.javascript.JSObject qui permet d’interagir avec le DOM de la page web contenant l'applet. Il est possible d'invoquer les méthodes habituelles de la nouvelle API LiveConnect introduite dans le JDK6 sur les objets de ce type ;
  • autre - la valeur retournée est null.


Par exemple :

Code Java : Sélectionner tout
final JSObject webContext = application.getHostServices().getWebContext();

Mis à jour le 1er octobre 2014 bouye

En accédant aux services d'hôte d'une application, il est possible d'invoquer la méthode showDocument() en passant en paramètre une chaine de texte contenant une URI. Invoquer cette méthode permet d'ouvrir le navigateur web du système d'exploitation sur une page web ou encore d'ouvrir un fichier stocké sur le disque dur (ex. : un fichier PDF ou Excel) dans l'application par défaut qui prend en charge ce type de fichiers.

Par exemple :

Code Java : Sélectionner tout
application.getHostServices().showDocument("http://www.developpez.com/");

Cette instruction ouvrira le navigateur web par défaut du système d'exploitation sur la page de garde du site de Développez.

Également :

Code Java : Sélectionner tout
getHostServices().showDocument("file:///C:/Users/fabriceb/Desktop/test.pdf");

Cette instruction ouvrira le fichier PDF spécifié dans la visionneuse PDF par défaut.

Dans le cas où votre application s’exécute en tant qu'Applet, un appel à cette méthode peut ne pas avoir d'effets si votre navigateur web est configuré de manière à prévenir l'apparition de fenêtres popup. De plus, le gestionnaire de sécurité Java peut empêcher l’accès à un fichier local.

Mis à jour le 1er octobre 2014 bouye

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -