Partage
  • Partager sur Facebook
  • Partager sur Twitter

Action doublée avec l'utilisation de JButton

    20 septembre 2019 à 10:23:54

    Bonjour,

    Je vous écris aujourd'hui en dernier recours. 

    Dans mon programme j'affiche une fenêtre qui par l'intermédiaire de boutons permet de créer (Nouvelle partie) ou récupérer (continuer) des variables dans une base SQL (A ce niveau la pas de soucis)

    Quand je clique sur continuer pour la première fois j'affiche dans le programme toutes les données utilisateur les unes après les autres en les passant avec 2 boutons (previous et next profile button) C'est parfait !!!

    (retour à l'écran titre grâce au décrément de la variable ChgProfile jusqu'a la valeur -1 càd avant l'affichage des profils)

    En revanche la seconde fois que j'appuie sur le bouton continuer  les valeurs défilent 3 par 3 puis au troisième clic sur ce bouton 7 par 7 bref vous avez compris...

    A noter que côté console toutes les valeurs apparaissent bien mais 3 par 3 du coup

        public static void Screen() 
        {
        	  
            /**
             * Délarations des paramètres de la fenêtre
             */
            //Création
      	 	 DispObjects.frame.getContentPane().add(DispObjects.panel);
            //Dimensionnement
      	 	 DispObjects.frame.setPreferredSize(new Dimension(1200, 800));
            //Redéfinition de l'icone
      	 	 DispObjects.frame.setIconImage(DispObjects.icone.getImage());
            //Bonne fermeture de la fenêtre
      	 	 DispObjects.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Positionnement du repère
      	 	 DispObjects.panel.setLayout(null); 
      	 	 
             //Application des paramètres
        	 DispObjects.frame.pack();
             //Affichage sur l'écran
        	 DispObjects.frame.setVisible(true);
             //Centrage du panneau
        	 DispObjects.frame.setLocationRelativeTo(null);
        	 
        	 new DispTitleScreen();
      	 	 
      	 	 
        }
       public DispTitleScreen()
        {
        	
             //Création du contenu du label
             /*Label.setBounds(x,y,width,height);*/
        	 DispObjects.text_area.setEditable(false);
        	 DispObjects.text_area.setOpaque(false);
        	 DispObjects.text_area.setLineWrap(true);
        	 DispObjects.text_area.setWrapStyleWord(true); 
         	 
        	 DispObjects.text_area.setForeground(DispColorFont.title_text_color);
        	 DispObjects.text_area.setFont(DispColorFont.title_text_font);
        	 DispObjects.text_area.setBounds(390, 200, 500, 60);
        	 DispObjects.panel.add(DispObjects.text_area);
        	 
        	 DispObjects.label_1.setBounds((1200-500)/2, 190, 500, 60);
        	 DispObjects.panel.add(DispObjects.label_1);
               
              
             //Crétion du contenu des boutons
        	 DispObjects.nvPart_button.setBounds((1200-700)/2, 320, 700, 100);
        	 DispObjects.continuer_button.setBounds((1200-700)/2, 480, 700, 100);
        	 DispObjects.parameters_button.setBounds(950, 680, 200, 50);
        	 DispObjects.more_button.setBounds(40, 680, 50, 50);
             
             
        	 DispObjects.nvPart_button.setHorizontalTextPosition(JButton.CENTER);
        	 DispObjects.nvPart_button.setVerticalTextPosition(JButton.CENTER);
        	 DispObjects.continuer_button.setHorizontalTextPosition(JButton.CENTER);
        	 DispObjects.continuer_button.setVerticalTextPosition(JButton.CENTER);
        	 DispObjects.parameters_button.setHorizontalTextPosition(JButton.CENTER);
        	 DispObjects.parameters_button.setVerticalTextPosition(JButton.CENTER);
        	 DispObjects.more_button.setHorizontalTextPosition(JButton.CENTER);
        	 DispObjects.more_button.setVerticalTextPosition(JButton.CENTER);
             
        	 DispObjects.nvPart_button.setFont(DispColorFont.text_font);
        	 DispObjects.continuer_button.setFont(DispColorFont.text_font);
        	 DispObjects.parameters_button.setFont(DispColorFont.text_font);
        	 DispObjects.more_button.setFont(DispColorFont.text_font);
             
        	 DispObjects.nvPart_button.setForeground(DispColorFont.text_color);
        	 DispObjects.continuer_button.setForeground(DispColorFont.text_color);
        	 DispObjects.parameters_button.setForeground(DispColorFont.text_color);
        	 DispObjects.more_button.setForeground(DispColorFont.text_color);
             
        	 DispObjects.panel.add(DispObjects.nvPart_button);
        	 DispObjects.panel.add(DispObjects.continuer_button);
        	 DispObjects.panel.add(DispObjects.parameters_button);
        	 DispObjects.panel.add(DispObjects.more_button);  
        	 
             /**
              * Définition du fond d'écran
              *
              */
             
        	 DispObjects.lab_ground.setBounds(0, 0, 1200, 800);
        	 DispObjects.panel.add(DispObjects.lab_ground);
        	            
             /**
              * Définition des actions liées à l'appui des boutons
              */
               
        	 DispObjects.nvPart_button.addActionListener(new ActionListener()
             {
                 public void actionPerformed(ActionEvent e)
                 {
                     rmvButtons();
                     defPseudo();    
                 }
             });
               
        	 DispObjects.continuer_button.addActionListener(new ActionListener()
             {
                 public void actionPerformed(ActionEvent e)
                 {
                	 rmvButtons(); //Permet simplement le passage de la fenetre d'accueil à la fenetre d'affichage des données
                	 choixPartie();
                     
                 }
             });
             
        	 DispObjects.parameters_button.addActionListener(new ActionListener()
             {
                 public void actionPerformed(ActionEvent e)
                 {
                     //Afficher les paramètres
                 }
             });
             
        	 DispObjects.more_button.addActionListener(new ActionListener()
             {
                 public void actionPerformed(ActionEvent e)
                 {
                     //Afficher plus 
                 }
             });
                      
             
            }
       public static void choixPartie()
        {
        	DispObjects.panel.remove(DispObjects.label_1);
        	DispObjects.panel.remove(DispObjects.lab_ground);
        	
        	DispObjects.text_area.setBounds(100, 60, 800, 500);
        	DispObjects.label_1.setBounds(50, 50, 1100, 700);
        	DispObjects.next_profile_button.setBounds(943, 675, 157, 37);
        	DispObjects.previous_profile_button.setBounds(100, 675, 157, 37);
        	
        	
        	DispObjects.panel.add(DispObjects.next_profile_button);
        	DispObjects.panel.add(DispObjects.previous_profile_button);
        	DispObjects.panel.add(DispObjects.label_1);
        	DispObjects.panel.add(DispObjects.lab_ground);
    
        	CreateDataBase.recupValues();
            texte = CreateDataBase.USER_DATA;  
            DispFunctions.dispText();
    
        	DispObjects.frame.getIgnoreRepaint();
        	DispObjects.frame.revalidate();
     	 DispObjects.next_profile_button.addActionListener(new ActionListener()
         {
             public void actionPerformed(ActionEvent e)
             {
                 CreateDataBase.ChgProfile++;
                 CreateDataBase.recupValues();
                 texte = CreateDataBase.USER_DATA;  
                 DispFunctions.dispText();        
             }
         });
       	 
    	 DispObjects.previous_profile_button.addActionListener(new ActionListener()
         {
             public void actionPerformed(ActionEvent e)
             {
                 CreateDataBase.ChgProfile--;
                 CreateDataBase.recupValues();
                 texte = CreateDataBase.USER_DATA;  
                 DispFunctions.dispText();           
             }
         });
        	
        }
     public static void recupValues()
    	 {
    		 //Connexion à la BD MySQL pour insérer le pseudo du joueur
    			Connection connection;
    			Statement statement;
    			ResultSet result;
    			
    			try
    			{
    				
    				connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + bd + "?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC", "root", "");
    				statement = connection.createStatement();
    				result = statement.executeQuery("SELECT " + colonne1 + "," + colonne2 + "," + colonne3 + "," + colonne4 + "," + colonne5 + "," + colonne6 + "," + colonne7 + " FROM " + table);
    				
    				List <Object[]> objs = new LinkedList<>();
    				
    				while(result.next())
    				{
    					Initialisation.PSEUDO = result.getString(colonne1);
    					Initialisation.RACE = result.getString(colonne2);
    					Initialisation.UNITRAGE = result.getInt(colonne3);
    					Initialisation.HP = result.getInt(colonne4);
    					Initialisation.XP = result.getInt(colonne5);
    					Initialisation.FORCE = result.getInt(colonne6);
    					Initialisation.MANA = result.getInt(colonne7);
    					
    					Object[] obj = new Object[7];
    					obj[0] = Initialisation.PSEUDO;
    					obj[1] = Initialisation.RACE;
    					obj[2] = Initialisation.UNITRAGE;
    					obj[3] = Initialisation.HP;
    					obj[4] = Initialisation.XP;
    					obj[5] = Initialisation.FORCE;
    					obj[6] = Initialisation.MANA;
    					objs.add(obj);
    				}	
    				
    				Object[][] tab = new Object[objs.size()][7];
    				
    				objs.toArray(tab);
    				
    				if(ChgProfile < 0)
    				{
    					ChgProfile = 0;
    					DispTitleScreen.rmvButtons();
    					new DispTitleScreen();
    					//new DispTitleScreen(); Crée une erreur dans l'affichage ???
    				}
    				else if(ChgProfile >= 0 && ChgProfile < objs.size())
    				{
    					System.out.println("\n##################################################\n");
    					for(int j = 0; j< 7; j++)
    					{
    						System.out.println(tab[ChgProfile][j]);
    					}
    					System.out.println("\n##################################################");
    					
    					USER_DATA = "\nPseudo : " + tab[ChgProfile][0] + "\nRace : " + tab[ChgProfile][1] + "\nUnit rage : " + tab[ChgProfile][2] + "\nXp : " + tab[ChgProfile][4] + "\nHp : " + tab[ChgProfile][3] + "\nForce : " + tab[ChgProfile][5] + "\nMana : " + tab[ChgProfile][6];
    
    				}
    				else if(ChgProfile >= 10)
    				{
    					ChgProfile = 10;
    				}
    				
    				connection.close();
    				
    			}catch(SQLException e1) {e1.printStackTrace();}
    				
    
    		
    	 }

    Je m'excuse par avance pour la grande quantité de code (j'ai essayé de mettre l'essentiel) et pour les lignes de code pas très propres :euh:

    Je précise également que DispObjects est une classe ou je stocke simplement tous mes objets boutons etc, DispFunction.dispText permet d'afficher le texte d'une certaine manière et tout ce qui est Texts.text_0 et DispColorFont sont des classes ou je gère les éléments de texte, couleur et police d'écriture

    J'espère ne pas avoir été trop imprécis, je vous remercie par avance pour votre aide :)

    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2019 à 10:45:41

      Le problème vient du fait que tu utilises toujours le même panel, à savoir DispObjects.panel, pour plein de choses différentes et successives.
      Ca t'oblige à gérer son contenu en ajoutant et en enlevant sans cesse des composants dedans, et au moindre oubli ça fait ce que tu décris.

      J'ai une idée de l'endroit d'où vient ton problème, mais je te propose beaucoup mieux : supprime carrément ta classe DispObjects et place tous ses composants (frame, panel, boutons, etc) dans les méthodes qui les créent. Si ça te fait peur, commence par supprimer seulement DispObjects.panel.

      Par exemple, je verrais bien que choixPartie récupère les données de recupValues() et crée un DispTitleScreen. Puis l'objet DispTitleScreen instancie lui-même un nouveau JPanel avec tous les boutons et zones de texte qui vont bien, le renvoie, et choixPartie l'insère dans le frame.
      Quand tu as besoin d'afficher autre chose, tu fais appel à un autre objet qui fait le même travail que DispTitleScreen, c'est-à-dire qu'il crée un JPanel tout prêt pour l'usage que tu veux en faire, et tu l'insères dans le frame à la place du panel précédent.

      • Partager sur Facebook
      • Partager sur Twitter
        29 septembre 2019 à 19:09:11

        Salut Zachee54,

        Je tiens à te remercier pour ton commentaire et m'excuser pour mon temps de réponse...

        J'ai fais ce que tu m'as conseillé en commençant par déplacer les frame, panel puis le reste... Assez vite j'ai eu des soucis de déclaration notamment de mon frame que j'appelle dans de nombreuses méthodes...

        J'ai donc suivi les recommandations de l'IDE, ce qui revenait à les déclarer dans la classe où sont déclarées toutes mes méthodes malheureusement je retombe sur la même situation j'ai donc le même problème qui se pose...

        Suis-je passé à côté de quelque chose pour déclarer mes objets dans les différentes méthodes ? :o

        • Partager sur Facebook
        • Partager sur Twitter
          30 septembre 2019 à 17:32:36

          Tu as manifestement un problème de design.
          Le problème est que quand on commence, on ne doit pas revoir seulement quelques classes mais toute l'application.
          Mais il faut s'y mettre quand même parce que plus tu le fais tôt, moins c'est douloureux :pirate:

          Dans un premier temps du peux garder ton frame dans une variable statique. Si c'est la fenêtre principale de ton application, on comprend que tu aies besoin d'y accéder depuis plusieurs endroits et que ce soit un gros morceau à modifier.

          Par contre il faut vraiment que tu déplaces le panel à l'intérieur d'une instance, voire d'une méthode.
          Contrairement au frame, tu n'as besoin du panel qu'au moment où tu le crées. Une fois que tes événements sont bien créés, les composants du panel vivent leur vie tout seuls. Ca ne devrait pas être la mer à boire ?

          -
          Edité par Zachee54 30 septembre 2019 à 17:33:14

          • Partager sur Facebook
          • Partager sur Twitter
            3 octobre 2019 à 16:58:33

            Salut,

            Je vais avoir beaucoup à faire mais je vais procéder aux modifications petit à petit comme tu me l'a conseillé.

            Merci pour les infos ! :D

            • Partager sur Facebook
            • Partager sur Twitter

            Action doublée avec l'utilisation de JButton

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown