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 :

récupérer le controlleur d'un anchorPane


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    en recherche premier cdi
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : en recherche premier cdi

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut récupérer le controlleur d'un anchorPane
    Bonjour à tous,

    Je suis en train de développer un jeu yugioh! et j'ai commencé par créer des interfaces pour faire un Deck Builder. Celui-ci a deux composants : un cardInfos qui affiche l'image et le texte d'une carte (qui vient d'un include car j'en aurais également besoin pour une autre interface duel) et un search engine. Ce dernier quand on fait une requête pour trouver une carte , pour chaque carte trouvée, il va générer un fxml de type CardResult (son controlleur contiendra autant que attribut le resultat de la carte )et ils vont tous être ajoutés à un gridpane.

    Le soucis que je rencontre, c'est que je veux ajouter un évènement à chaque CardResult du gridPane, quand je clique dessus, je puisse récupérer le résultat et pouvoir changer l'image et le texte du composant cardInfos. Cependant je ne sais pas comment récupérer le controlleur qui contient les infos dont j'ai besoin

    ici le code du deckBuilder controller
    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
     
        public class DeckBuilderController implements Initializable{
     
    	//SEARCH CARD ENGINE=========================
    	@FXML 
    	TextArea cardNameInputText;
     
    	@FXML 
    	GridPane cardResultList;
     
    	//CARD INFOS INTERFACE=======================
    	@FXML
    	AnchorPane cardInfos;
     
    	@FXML
        CardInfosController cardInfosController ;
     
     
    	public void searchCard() throws IOException
    	{
    		String cardName = cardNameInputText.getText() ;
     
    		if (cardName != "")
    		{
    			try
    			{
    				Connection connex = DatabaseEngine.connect();
     
    				ResultSet res = DatabaseEngine.selectCards(connex, cardName);
     
    				int countCol = 0;
     
    				int countRow = 0;
     
     
    				while(res.next())
    				{
     
    					cardResultController controller = new cardResultController(res);
     
     
    					controller.getStage().getScene().getRoot().setOnMouseEntered(new EventHandler<MouseEvent>() {
    		                @Override
    		                public void handle(MouseEvent event) {
     
    		                	System.out.println("mouseEvent");
     
     
    		                	Parent anchor = (Parent) event.getTarget() ;
     
    		                	//cardInfosController.setBigCardImageView(recuperer le path de l'image dans le controlleur ???);
     
    				       //cardInfosController.setCardDescriptionTextArea(recupérer le description de la carte dans le controlleur ???);
     
    		            });
     
                                 //two colones on teh gripane
    			        if (countCol == 2)
    			        {
    			        	countCol = 0;
     
    			        	countRow++;
    			        }
     
     
    			        cardResultList.add(controller.getStage().getScene().getRoot(), countCol, countRow);
     
    			        countCol++;
    			     }	
     
    			}
    			catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
     
     
    	@Override
    	public void initialize(URL arg0, ResourceBundle arg1) {
     
    		        System.out.println( cardInfos);
    		        System.out.println(cardInfosController);
    	}
    }
    ici le builderInterface
    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
     
    <AnchorPane fx:controller="controller.DeckBuilderController">
       <children>
          <BorderPane fx:id="cardBuilderPane" >
             <right>
                <AnchorPane>
                      <FlowPane>
                            <Pane>
                                  <TextArea fx:id="cardNameInputText" promptText="Enter card name here" />
                                  <Button fx:id="searchCardButton"/>
                               </children>
                            </Pane>
                            <ScrollPane>
                                  <GridPane fx:id="cardResultList">
                                  </GridPane>
                            </ScrollPane>
                      </FlowPane>
                   </children>
                </AnchorPane>
             </right>         
         </BorderPane>
         <fx:include fx:id="cardInfos" source="CardInfosInterface.fxml" />
    </AnchorPane>
    ici le cardResult controller

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    public class cardResultController implements Initializable {	
     
    	@FXML
    	ImageView cardImage;
     
    	@FXML
    	Text cardNameTF;
     
    	@FXML
    	TextFlow cardInfos;
     
    	@FXML 
    	TextFlow cardAtkDef;
     
    	private ResultSet res ;
     
    	private final Stage stage;
     
     
    	public cardResultController(ResultSet res) throws IOException
    	{
    		System.out.println("helo from here");
     
    		this.res = res;
     
    		this.stage = new Stage();
     
    		FXMLLoader loader = new FXMLLoader(new File("src/main/java/interfaces/cardResultInterface.fxml").toURI().toURL());
     
    		// Set this class as the controller
            loader.setController(this);
     
            this.stage.setUserData(res);
     
            // Load the scene
            this.stage.setScene(new Scene(loader.load()));
     
    	}
     
     
    	/**
        * Show the stage that was loaded in the constructor
        */
        public Stage getStage()
        {
        	return stage;
        }
     
        public void setCardInfos(String Attribute,  String Race, String Level) 
        {
        	cardInfos.getChildren().addAll(new Text(Attribute), new Text("/"), new Text(Race), new Text("/"), new Text(Level));	
        }
     
        public void setCardAtkDef(String Atk,  String Def)
        {
        	cardAtkDef.getChildren().addAll(new Text(Atk), new Text("/"), new Text(Def));
        }
     
    	public ImageView getCardImage() 
    	{
    		return cardImage;
    	}
     
    	public TextFlow getCardInfos() 
    	{
    		return cardInfos;
    	}
     
    	public void setCardInfos(TextFlow cardInfos) 
    	{
    		this.cardInfos = cardInfos;
    	}
     
    	public ResultSet getRes() 
    	{
    		return res;
    	}
     
    	@Override
    	public void initialize(URL arg0, ResourceBundle arg1) 
    	{
    		try
    		{
     
    			System.out.println("res name : ::" + res.getString("name"));
     
    			cardImage.setImage(new Image((res.getString("imageSmall"))));
     
    			cardNameTF.setText(res.getString("name"));
     
    			setCardInfos(res.getString("attribute"), res.getString("race"), String.valueOf(res.getInt("level")));
     
    			setCardAtkDef(String.valueOf(res.getInt("atk")), String.valueOf(res.getInt("def")));
     
    		}
    		catch(Exception e)
    		{
    			System.out.println("error with res");
    		}
    	}
     
    	public void setOnMouseEntered(EventHandler<MouseEvent> eventHandler) {
    		// TODO Auto-generated method stub
     
    	}
    voici une capture de linterface du deeckBuilder sur SceneBuilder
    Nom : db.png
Affichages : 235
Taille : 499,4 Ko

    et voici ce que je veux faire
    Nom : deckBuilderNexus.png
Affichages : 227
Taille : 1,47 Mo
    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Rappel : en Java les noms de classe commencent par des majuscules, cardResultController -> CardResultController.

    La question est pas très claire pour moi (ou je suis rouillé). Normalement, ta variable cardInfosController a du être initialisée a la bonne valeur lors du chargement du FXML (et de son sous-FXML qui est inclus dedans) si CardInfosInterface.fxml (qu'on a pas) contient bien la description du contrôleur de ce fichier.
    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

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    en recherche premier cdi
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : en recherche premier cdi

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    pour expliquer, en fait j'aimerais rajouter un event (clickEvent ) au CardResult aprés l'avoir crée dans le deckBuilderController. Cet évènement va récupérer les informations qui se trouvent dans son controlleur CardResultController (ResultSet res). Ces informations vont pouvoir m'aider pour changer l'image et le texte du CardInfos (un composant include). Le soucis c'est que je ne trouve pas de methode getController comme avec le fxmlLoader etc... De façon générale ma question est "comment récupérer les données d'un contrôleur et utiliser ses méthodes depuis l'interface ?". J'aimerais faire quelque chose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	controller.getStage().getScene().getRoot().setOnMouseEntered(new EventHandler<MouseEvent>() {
     
    					@Override
    	                public void handle(MouseEvent event) {
     
    		                	Parent anchor = (Parent) event.getTarget() ;
     
     
    					cardInfosController.setBigCardImageView(anchor.getController().getRes.getImage());
     
    	            });

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Par défaut, il n'est pas possible d'atteindre le contrôleur en partant du composant graphique. Il faut donc trouver un moyen de l'exposer ou de l'associer. Une manière de faire parmi d'autres est d'attacher le contrôleur au composant via setUserData() ou avec un nom de propriété custom via getProperties().put().

    Attention aux fuites mémoires par contre.

    Une manière plus correcte de faire par rapport au modèle MVC, mais plus complexe a mettre en place est de créer un nouveau composant CardResult qui hérite de Region et dont le skin (la vue) est le FXML et qui contient une référence sur le contrôleur en interne (son behavior). Comme ça, c'est CardResult que tu manipules et lui transmet les listeners, valeurs, etc. a son contrôleur
    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

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/05/2018, 13h17
  2. [Débutant] Récupérer une image depuis la vue vers le controlleur.
    Par lewolf dans le forum ASP.NET MVC
    Réponses: 8
    Dernier message: 16/08/2015, 08h24
  3. [PHP 5.3] Récupérer Controlleur avec URL
    Par gawel1 dans le forum Langage
    Réponses: 0
    Dernier message: 29/10/2011, 10h44
  4. Réponses: 1
    Dernier message: 01/04/2008, 09h28
  5. [AJAX] : Récupérer les itemps d'une liste dans un controlleur
    Par titoumimi dans le forum Ruby on Rails
    Réponses: 8
    Dernier message: 16/05/2007, 22h42

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