Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation javafx

Scene builder

5 novembre 2019 à 13:29:39

Salut à tous j'aimerais savoir comment doit on procéder pour monter une application avec javafx .J'ai déja installé scene builder mais je ne comprend pas comment interagir cette interface avec le code.Svp veuillez m'expliquer en détails.

  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2019 à 9:18:51

Bonjour à Tous,

Je regarde le cours sur Apprendre à programmer en Java, installation des outils. J'ai mis en place SceneBuilder et installé e(fx)clipse 3.6

Sur mon Mac OSX 10.11 El Capitan, j'ai mis en place Eclipse 2019.06 (4.12.0.120190605-1800).

Donc, j'ouvre un nouveau projet JavaFX, en suivant le cours je supprime le Package Application et crée les 3 Packages fr.testfx.personnes.controler

fr.testfx.personnes.view et fr.testsfx.personnes.model et dans le second clic droit New/Other/JavaFX/New XML Document.

Là, la "boîte de dialogue" FXML File me demande de lui attribuer un nom Par exemple PersonView et mon problème que je n'arrive pas à régler: Il m'est demandé -Select a Root Element-; mais quand je regarde le Root Element (Rectangle blanc avec à l'extrémité droite deux flèches pour menu déroulant) et encore à droite un"bouton" Browse . Mais aucune action possible, ni sur le menu déroulant, ni sur Browse.

Je ne peux qu'actionner sur Dynamic Root.

En conséquence, ni les "boutons" NEXT, ni FINISH ne sont accessibles et donc, le document FXML n'est pas créé.

Je suis donc dans l'impasse, j'ai conscience que je ne réponds pas à wilngue (la question précédente) mais si quelqu'un pouvait se pencher sur mon problème, je l'en remercie par avance

  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2019 à 19:55:26

Salut à vous deux !

Je vais dans un premier temps répondre à toi wilngue :

Tout d'abord il faut savoir que de base, JavaFX est installé sur les versions inférieure ou égale à Java 11. Si tu utilises OpenJDK 12 il faut installer JavaFX soi même. Je te conseille plutôt d'utiliser OpenJDK 11 pour le moment, car cette  version est encore une version récente de Java.

Ensuite, je vais te montrer comment monter un projet sur IntteliJ car c'est l'IDE que j'utilise personnellement.

Ouvre alors ton IDE, créé ou non un projet JavaFX, ça n'a pas vraiment d'importance. Le plus important est d'avoir au minimum cela :

Un dossier resources où se trouveront tes fichiers fxml (Fichiers que tu pourras éditer avec Scene Builder).
Pour le créer : clique droit sur le nom de ton projet (ici testOC) => New => Directory.
Pour le marquer comme étant un dossier source : clique droit sur le dossier (ici resource) => Mark directory as => Resources root
Maintenant, tu peux cliquer droit sur ce dossier afin de créer tes fichiers fxml.

Ensuite dans src créé tes packages, puis une classe que personnellement je nomme Launch. Cette classe est en quelque sorte ta classe Main. Voyons à quoi cette dernière doit ressembler :

public class Launch extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        stage.show();
    }
}


Tu peux voir dans un premier temps que Launch hérite de Application qui est plus ou moins la classe qui structure le cheminement de ton code (Point de départ, sortie).

C'est pourquoi on redéfini la fonction start() qui est appelée lorsque tu exécutes ton programme. Cette fonction prend en paramètre un Stage qui est simplement une fenêtre. Pour que l'utilisateur puisse voir cette fenêtre, il faut alors appeler la méthode show() qui permet de l'afficher. Tout simplement.

Il se peut que tu ne puisses pas exécuter ton programme car nous n'avons pas défini le point de départ à ton IDE. Pour cela, dans IntelliJ clique en haut à droite sur Main (à côté du marteau vert) => Edit configurations => dans Main Class: renseigne le nom complet de ta classe de départ (Launch pour moi où sont nom complet est : main.java.launch.Launch).

Bon c'est bien on a déjà notre fenêtre mais bon elle sert un peu à rien ^^

Donc maintenant, ajoutons lui un bouton par exemple. Je ne suis personnellement pas un grand fan de Scene Builder, avec le peu d'expérience que j'ai je me suis habitué à ne créer, redimensionner, aligner, et créer des liens qu'en ligne de code. (Bon d'accorder, ce n'est pas très esthétique mais pour les fonctionnalités de bases ça fonctionne très bien).

Pour cela, aller dans votre fichier fxml (ici PrincipalWindow.fxml) et ajoutons un bouton :

<AnchorPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
    <FlowPane>
        <Button text="Je suis un bouton" fx:id="button_1" onAction="#clickButton"></Button>
    </FlowPane>
</AnchorPane>


- text permet de donner du text à ton bouton
- fx:id permet de donner un identifiant à ton bouton
- onAction permet d'appeler une méthode lorsqu'on appuiera sur ton bouton ("#" permet de dire qu'il s'agit bien d'une méthode).

Maintenant, ton bouton est créé. Tu peux exécuter ton programme mais cela ne fonctionnera toujours pas car nous n'avons créé aucun lien entre ton fxml et ta classe Launch. Mais ne t'en fait pas on avance petit à petit.

Avant cela, créons une classe (pour plus de clarté je te conseille de nommer cette classe comme le nom de ton fichier fxml), ici PrincipalWindow.

Cette classe se compose :

- d'un attribut Button où son nom est le même que l'identifiant donné à ton bouton de ton fichier fxml (ici button_1)
- d'une méthode nommée comme celle définie dans ton fichier fxml (ici clickButton) et qui change le texte de ton bouton lorsque cette dernière est appelée :

public class PrincipalWindow {
    @FXML
    Button button_1;

    @FXML
    private void clickButton(){
        button_1.setText("Tu viens de cliquer sur moi");
    }
}

ATTENTION de ne pas utiliser la bibliothèque java.awt mais d'utiliser javafx (car ces deux bibliothèques ont des classes qui ont le même nom mais qui ne font pas la même chose).

Bien, maintenant la classe PrincipalWindow et le fichier fxml sont liés : la classe reconnait le bouton que l'on a créé et quand on clique dessus, on attrape cette action pour la traiter dans la méthode clickButton().

A présent il faut modifier la méthode start() de notre classe Launch :

    @Override
    public void start(Stage stage) throws Exception {
        PrincipalWindow pw = new PrincipalWindow();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("./PrincipalWindow.fxml"));
        loader.setController(pw);
        Parent root = loader.load();

        Scene scene = new Scene(root);
        stage.setScene(scene);

        stage.setTitle("Hello");
        stage.show();
    }
}


1- On créé une instance de notre classe où se trouve notre bouton button_1 ainsi que sa méthode clickButton()
2- On prépare le chargement de notre fichier fxml
3- On associe la classe PrincipalWindow au fichier fxml (en lui disant que PrincipalWindow sera son controller)
4- On charge notre fichier fxml qui a maintenant son contrôleur

5- On créé une scène qui contient tous les éléments
6- On dit à notre fenêtre de contenir cette scène

7- On donne un nom à notre fenêtre (car c'est quand même plus sympa)
8- On affiche la fenêtre (qui contient maintenant le bouton que nous avons créé ainsi que sa fonctionnalité qui est de changer de nom lorsqu'on clique dessus).

Voila, j'espère t'avoir aidé, et que tu as compris la logique de fonctionnement.
Je suis conscient que ce n'est pas évident au début, mais avec l'expérience on s'y fait !

N’hésite pas si tu as ds questions ! Bon courage.

-------------------------

GuvBesson1 as tu des captures d'écran stp ?

Je n'utilise pas éclipse et j'ai du mal à visualiser le problème surtout quant tu dis "la "boîte de dialogue" FXML File me demande de lui attribuer un nom"...

Merci ;)

-
Edité par Petitboy38 8 novembre 2019 à 20:05:22

  • Partager sur Facebook
  • Partager sur Twitter

LeCodeurFou

24 novembre 2019 à 19:12:40

Salut j'aimerais savoir si quelqu'un peut m'aider pour la connexion d'une interface javafx avec la base de données
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2020 à 13:53:36

Bonjour GuyBesson1

J'imagine que tu as déjà trouvé une solution depuis novembre. Mais, au cas, j'ai eu exactement la même chose. Et j'ai réussi à le régler en ajoutant le .jar dans les librairies (Build Path > Libraries > ClassPath > Add external JARs...) de SceneBuilder (jrt-fs.jar - javafx-swt.jar) dans le projet.

Au moment de créer un FXML, ça me propose alors AnchorPane comme root element.

Cordialement,

  • Partager sur Facebook
  • Partager sur Twitter