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 :

[Scene] Gestion d'une comboBox sur deux scènes différentes


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 13
    Par défaut [Scene] Gestion d'une comboBox sur deux scènes différentes
    Bonjour à tous,

    Voici mon problème: J'ai créé une fenêtre, qui contient deux scènes différentes. La première (le menu) contient une comboBox et la deuxième est sensée afficher le choix de l'utilisateur.
    J'ai donc dans ma classe Controller (j'utilise FXML en mode MVC) deux classes:

    -la première gère les deux boutons, qui permettent de passer d'une scène à l'autre:
    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
     
    public void handleButtonAction(ActionEvent event) throws IOException{ 
     
    	        if(event.getSource()==btn1){
     
            	    String test = comboBox.getValue();
     
    	        	switch (test){
     
    	        	  case "fct 1": x = 1; break;    //x est une variable (int) qui me permet de passer la valeur de la comboBox d'une classe à l'autre.
     
    	        	  case "fct 2": x = 2; break;  
     
    	        	  default: x = 0;
    	        	}
     
    	        	window = (Stage) btn1.getScene().getWindow();
    	        	root = FXMLLoader.load(getClass().getResource("/TuringStyle.fxml"));
    	        }
     
    	        if(event.getSource()==btn2){
     
    	        	window = (Stage) btn2.getScene().getWindow();	          
    	        	root = FXMLLoader.load(getClass().getResource("/MenuTuring.fxml"));
    	        }
     
    	    scene = new Scene(root, 800, 600);
    	    window.setScene(scene);
    	    window.show();
    	}

    -la seconde qui affiche, dés l'entrée de la souris sur la deuxièmes scène "gr1" ou "gr2" en fonction du choix de l'item de la comboBox (comboBox qui se trouve donc sur la première scène):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void putGraphOn (MouseEvent event){
     
    		if(event.getEventType()== MouseEvent.MOUSE_ENTERED){
     
    			switch(x){
        			case 1: gr1.setVisible(true); break;
        			case 2: gr2.setVisible(true); break;
        			default: System.out.println("testKO! :/");
    			}
    		}
    	}
    Malheureusement, ma variable se réinitialise à 0 chaque fois que je change de scène, ce qui évidemment ne me convient absolument pas!

    Quelqu'un aurait un petit conseil à me donner?

  2. #2
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 13
    Par défaut
    Bonjour,

    Je n'ai toujours pas trouvé de solution à mon problème...
    Quelqu'un aurait, ne serait-ce que des pistes de réponses?
    Merci!

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2013
    Messages : 20
    Par défaut
    salut,

    tu peux poster le code complet des fichiers qu'on voie ce que tu veux faire et comment tu l'as implementé a partir de la on pourra plus facilement te montrer ce qu'il faudrai changer


    par exemple est ce obliger de changer de scene? ^^

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 13
    Par défaut
    Tout d'abord, merci pour la réponse!

    Pour pouvoir séparer mon menu du reste de mon interface, je devais ou changer de scène, ou changer de fenêtre.
    Je pense pouvoir le faire en changeant de fenêtre, mais esthétiquement, je trouve ça nettement moins joli et je n'ai pas réussi à adapter la méthode...

    Mon projet se compose donc de deux fichier FXML (un pour chaque scène), d'un controller lié à ces deux fichier et d'une classe Main.
    Le fichier FXML correspondant au menu initialise une combo Box.

    Le code donné précédemment correspond aux deux classes qui se trouvent actuellement dans mon controller.

    Ma classe Main ne fait que lancer l'application en chargeant le FXML du menu pour pouvoir l'afficher (elle fonctionne sans problème).

    Le code ci-dessous est le même que précédemment, je vais juste ajouter des commentaire pour que ce soit plus clair... Je pense que les fichiers FXML et Main n'ajouteront rien, ils fonctionnent a priori sans erreurs.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    package application;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Group;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ComboBox;
    import javafx.scene.input.MouseEvent;
    import javafx.stage.Stage;
     
    public class Controller implements Initializable {
     
    	@FXML
    	private Button btn1,btn2; //bt1 se trouve sur la scène 1 et btn2 sur la scène 2. Ils permettent de passer d'une scène à l'autre.
    	@FXML
    	private ComboBox<String> comboBox; //Sur la scène 1.
    	@FXML
    	private Stage window;
    	@FXML
    	private Parent root; 
    	@FXML
    	private Group gr1,gr2;  /* Les éléments à afficher en fonction du choix de l'utilisateur: s'il choisit fct1, j'affiche gr1 (idem pour 2). Par défaut, leur visibilité est à "False". Mon but est de la transformer en "True" pour l'un des deux groupe. */
     
    	private Scene scene;  //Représente la nouvelle scène qui sera chargée.
    	private int x;
     
    	public void handleButtonAction(ActionEvent event) throws IOException{ 
     
    	        if(event.getSource()==btn1){  //Passage à la scène 2.
     
            	    String test = comboBox.getValue();  //Récupération de la valeur choisie par l'utilisateur via la combBox.
     
    	        	switch (test){ //Initialisation de la variable x en fonction de ce choix.
     
    	        	  case "fct 1": x = 1; break;
     
    	        	  case "fct 2": x = 2; break;  
     
    	        	  default: x = 0;
    	        	}
     
    	        	window = (Stage) btn1.getScene().getWindow();  //Récupération de la fenêtre
    	        	root = FXMLLoader.load(getClass().getResource("/TuringStyle.fxml"));  //Chargement du second fichier FXML
    	        }
     
    	        if(event.getSource()==btn2){  //Retour à la scène 1.
     
    	        	window = (Stage) btn2.getScene().getWindow();    //Récupération de la fenêtre
    	        	root = FXMLLoader.load(getClass().getResource("/MenuTuring.fxml"));   //Chargement du premier fichier FXML
    	        }
     
    	    scene = new Scene(root, 800, 600); //Affichage de la nouvelle scène.
    	    window.setScene(scene);
    	    window.show();
     
            //A cet endroit ci, la valeur de x correspond toujours au choix de l'utilisateur.
     
    	}	
     
    	public void putGraphOn (MouseEvent event){  
     
    		if(event.getEventType()== MouseEvent.MOUSE_ENTERED){     //Quand ma souris entre sur la deuxième fenêtre, je veux qu'elle m'affiche le choix de l'utilisateur.
     
                           //A l'entrée de cette fonction, x == 0. Or, il a obligatoirement été initialisé plus haut, puisque l'on asse d'office par le tut premier "if" pour atteindre la fenêtre 2.
     
    			switch(x){   //Selon la valeur de ce choix:
        			case 1: gr1.setVisible(true); break;     //afficher gr1
        			case 2: gr2.setVisible(true); break;    //afficher gr2
        			default: System.out.println("testKO! :/");   //Me signaler qu'aucune valeur n'a été trouvée.
    			}
    		}
    	}
     
    	@Override
    	public void initialize(URL location, ResourceBundle resources) {  //méthode qui n'a pas encore d'utilité...
    		// TODO Auto-generated method stub
     
    	}
     
    }
    Le problème se situe donc entre les deux méthodes. Pourtant, x est déclarer en dehors de ces méthodes, donc une fois que je l'initialise, sa valeur devrait être transférée d'une classe à l'autre...
    J'espère que ça t'aidera à comprendre ce que je veux faire... Si pas, n'hésite pas à poser des questions! Mes explications ne sont peut-être pas toujours très claires, mais je peux répondre à des questions précises...

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Oui ça serait mieux avec un exemple simple réutilisable (pas besoin de poster l’intégralité du coté de ton logiciel, juste un exemple auto-suffisant démontrant le soucis). En plus qui sait ça te permettrait peut-être de corriger toi-même le soucis en écrivant le test.

    Effectivement, est-il nécessaire de recréer une scène complète a chaque fois (ce qui peut-être nécessaire lorsqu'on a des boite des dialogue par exemple) ou ne vaut mieux t-il pas tenter de réutiliser la même (lorsqu'on a des fenêtres cotes a cotes par exemple).
    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

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Grilled

    Ton problème est peut-être justement suivant la manière dont tu récupères / instancies ton contrôleur. Si le contrôleur est en double (une erreur de manip sur les FXML qui arrive assez souvent chez les débutants), le x de la seconde instance n'aura pas la bonne valeur.
    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 averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 13
    Par défaut
    Je mettrai un code plus complet après quelques heures de sommeil...

    Bouye, ton commentaire m'a fait réfléchir: Que veux-tu dire par "Si le contrôleur est en double"?


    1ère ligne FXML du menu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <BorderPane prefHeight="605.0" prefWidth="739.0" style="-fx-background-color: #FFFFE0; -fx-background-radius: 4;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">

    1ère ligne FXML de ma seconde scène:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <BorderPane onMouseEntered="#putGraphOn" prefHeight="605.0" prefWidth="739.0" style="-fx-background-color: #FFFFE0;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire une condition sur deux lignes différentes ?
    Par sogelinas dans le forum SAS Base
    Réponses: 4
    Dernier message: 08/10/2014, 03h33
  2. Réponses: 6
    Dernier message: 24/05/2014, 12h38
  3. Réponses: 5
    Dernier message: 15/03/2014, 18h08
  4. Comment concevoir une application sur deux plateformes différentes ?
    Par Fab4v dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 21/02/2014, 17h46
  5. Réponses: 6
    Dernier message: 28/02/2007, 09h37

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