IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Application multifenêtre avec SceneBuilder


Sujet :

JavaFX

  1. #1
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut Application multifenêtre avec SceneBuilder
    Bonjour,

    Je commence à apprendre à me servir de SceneBuilder, mais je ne sais pas trop quelles sont les bonnes pratiques.

    J'ai créé une application qui ouvre une fenêtre principale appelée "MainWindow". Elle est construite comme il se doit avec un fichier MainWindow.fxml, et les actions sur les menus et les contrôles sont dans un fichier "MainWindowController.java".
    J'ouvre une nouvelle fenêtre avec une commande de menu, cette fenêtre me servira à enregistrer des éléments (liste de produits, de clients...). La commande de cet item s'appelle AjouterTrucs() et voici son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void menu_Fichier_AjouterTrucs() {
     
    		try {
    			AnchorPane root = (AnchorPane) FXMLLoader.load(getClass().getResource("AjouterTrucs.fxml"));
    			Stage Ajouter = new Stage();
    			Scene scene = new Scene(root, 640, 480);
    			Ajouter.setScene(scene);
    			Ajouter.show();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
    J'ai donc créé une nouvelle fenêtre avec un nouveau fichier AjouterTrucs.fxml, avec un nouveau contrôleur AjouterTrucsController.java
    Sauf que maintenant, je voudrais faire un bouton pour fermer la fenêtre. Or, si je comprends bien, ce que je construis avec SceneBuilder, et qui est décrit par mon fichier AjouterTrucs.fxml, c'est mon AnchorPane. Et si je veux fermer la fenêtre, je dois bien récupérer l'objet Stage pour faire : stage.close();

    Comment dois-je faire ? Faire un seul contrôleur pour toutes les fenêtres de mon application ? Sinon, comment récupérer mon objet Stage dont dépend mon contrôleur AjouterTrucsController ?

    Merci de vos éclaircissements.

  2. #2
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    essayer (dans votre contrôleur AjouterTrucsController.java):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @FXML
        private void close(ActionEvent event) {
     
           XXX.getScene().getWindow().hide();
        }
    ce code doit être associé au bouton fermer.
    XXX peut être n’importe quel composant appartenant à votre AnchorPane et annoté @FXML.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Également attacher le Stage enfant au Stage parent avec initOwner() et réfléchir a sa modalité avec initModality(), le tout avant de le rendre visible.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Bonjour à tous,

    C'est vrai que je débute avec Scene Builder et que je n'ai encore pas bien compris à quel moment je dois annoter mes éléments avec @FXML. Pour l'instant, ça a semblé marcher sans que j'aie besoin de le faire.

    Pour le moment, j'ai construit des "Panes" (AnchorPane, en l'occurrence) avec Scene Builder, et j'ai créé pour chacun des "contrôleurs" en Java. Le problème, c'est qu'il n'y a pas de code Java qui manipule ces objets, mis à part le lancement de la première fenêtre dans ma fonction Main(). Le seul code java en dehors du Main, c'est mes "contrôleurs", et ce ne sont pas des composants, ni des scenes, ni des stages. Donc, aucun moyen de faire référence à l'élément stage ou scene avec getScene() ou getWindow().

    Il y a sans doute quelque chose que je ne comprends pas bien dans le fonctionnement de Scene Builder.

    En fait, je n'arrive même pas à ouvrir la seconde fenêtre, puisque j'ai besoin de faire référence à mon Stage depuis le "contrôleur".

    Je sens bien que je pose des questions bêtes, et qu'il me manque les bases de cette technique, mais s'il vous plaît, soyez indulgents.
    Merci pour votre bienveillance.

  5. #5
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Grâce au tuto de Phil Johnson ci-dessous, j'ai compris qu'on pouvait accéder à la Scene et à la Stage parentes en passant par l'événement de la méthode qui doit déclencher l'ouverture de la nouvelle fenêtre. J'ai donc écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @FXML
    	public void menu_Fichier_NouvelleFenetre(ActionEvent event) throws IOException {
     
    			root = (AnchorPane) FXMLLoader.load(getClass().getResource("NouvelleFenetre.fxml"));
    			Scene sceneNouvelleFenetre = new Scene(root);
    			Stage myStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
     
    			myStage.setScene(sceneNouvelleFenetre);
    			myStage.show();
    	}
    Mais ça ne marche pas non plus : j'ai une RunTimeException in thread "JavaFX Application Thread". Alors pourquoi ?

    Voici le tuto :

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et quels sont les détails/la trace de cette RuntimeException ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Je me rends compte que, dans mes posts, j'ai appelé la nouvelle fenêtre tantôt "NouvelleFenetre", tantôt "AjouterTrucs". Evidemment, elle ne s'appelle ni l'un ni l'autre, mais dans mon projet, c'est cohérent. Ici, je l'ai appelée "NouvelleFenetre". Et bon courage pour la lecture ! Voici la trace complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    	at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    	at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    	at javafx.event.Event.fireEvent(Event.java:198)
    	at javafx.scene.control.MenuItem.fire(MenuItem.java:462)
    	at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
    	at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
    	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    	at javafx.event.Event.fireEvent(Event.java:198)
    	at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    	at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    	at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
    	at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    	at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    	at com.sun.glass.ui.View.notifyMouse(View.java:937)
    	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    	at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.reflect.InvocationTargetException
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at sun.reflect.misc.Trampoline.invoke(Unknown Source)
    	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    	at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    	... 43 more
    Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node
    	at application.MainWindowController.menu_Fichier_NouvelleFenetre(MainWindowController.java:43)
    	... 53 more

  8. #8
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    En relisant la trace attentivement, je me rends compte que le problème vient simplement du fait que je ne peux pas caster mon MenuItem en Node. C'est logique. Je comprends : ce n'est pas un Node. Mais comment remonter au Node ? J'ai réussi à remonter au menu parent (MenuItem.getParentMenu()), mais après, j'ai regardé toutes les méthodes disponibles, je ne trouve pas.

Discussions similaires

  1. Application utilisable avec plusieurs SGBD - ADO ou DBX ?
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 08h25
  2. Application multiplateforme avec interface graphique
    Par TNorth dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 31/01/2004, 18h55
  3. Réponses: 2
    Dernier message: 26/05/2003, 19h42
  4. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo