Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle infinie d'héritage et d'instanciations de classes

Sujet résolu
    25 août 2009 à 15:42:36

    Bonjour à tous !

    Comme le dit le titre que j'ai donné au topic, j'ai un problème de boucle infinie.
    Mon projet est constitué de 3 classes :
    la classe main
    la classe Fenetre
    la classe Affichage_arcades

    La classe main instancie la classe Fenetre.
    La classe Fenetre instancie la classe Affichage_arcades.
    La classe Affichage_arcades hérite de la classe Fenetre.

    Vous comprenez donc bien que la boucle infinie est située au niveau des classes Fenetre et Affichage_arcades.

    Description des classes :
    La classe main ne fait actuellement rien d'autre qu'instancier la classe Fenetre, pour afficher une JFrame.
    La classe Fenetre créé cette JFrame et y placer des composants (plus précisément dans son panel). Seulement, il faut que je puisse faire une liste des jeux d'arcades, qui sera affichée dans le panel de la JFrame. J'instancie pour cela la classe Affichage_arcades. Attention : dans la classe Fenetre, aucun composant concernant l'affichage des jeux n'est créé.
    La classe Affichage_arcades permet donc de créer puis de placer les composants (autant de JLabels qu'il y a de jeux) dans le panel de la JFrame. Or, ce panel étant créé dans la classe Fenetre, je ne peux y accéder (même en mettant la variable panel de type globale !). J'ai donc hérité cette classe de Fenetre.

    Il y a donc boucle infinie entre Fenetre et Affichage_arcades à cause de l'instanciation et de l'héritage... :(

    Si quelqu'un pouvait me dire comment m'en sortir, je lui en serais très reconnaissant ^^
    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      25 août 2009 à 15:44:12

      Salut,

      est-ce qu'il serait possible de voir le code des trois classes ?

      Merci.
      • Partager sur Facebook
      • Partager sur Twitter
        25 août 2009 à 15:47:32

        Oui, bien sûr...
        Heum...c'est pas courant, "dod" lol

        public class main {
        
        
        
        	public static void main(String[] args) {
        
        
        		main main = new main();
        		
        		
        
        	}
        	
        	
        	main(){
        		
        		
        		
        		Fenetre fenetre = new Fenetre();
        		
        		
        		
        		
        	}
        	
        	
        
        }
        


        public class Fenetre extends JFrame{
        
        	
        	JPanel container = new JPanel();
        
        	
        	Fenetre(){
        
        
        try {
        			Affichage_arcades aa = new Affichage_arcades();
        		} catch (Exception e) {
        			// TODO Auto-generated catch block
        			e.printStackTrace();
        		}
        		
        		
        		
        		//Affichage de la fenêtre
        		setVisible(true);
        }}
        


        import java.io.File;
        
        import javax.swing.JLabel;
        
        
        public class Affichage_arcades extends Fenetre {
        	
        	
        	
        	
        	Affichage_arcades() throws Exception{
        		
        		
        		int j = 0;
        		int i = 0;
        		
        		
        		File dossier = new File("arc");		
        		File nombreFichiers[] = dossier.listFiles();
        			
        		
        		
        		for(j = 0; j < nombreFichiers.length; j++)
        		{
        			
        			
        
        			JLabel affichageDesJeux = new JLabel(""+nombreFichiers[j]);
        			container.add(affichageDesJeux);
        			System.out.println("ok");
        			
        		}
        		
        		
        		
        	}
        	
        	
        	
        	
        
        }
        


        Le premier étant main, le second Fenetre et le troisième, Affichage_arcades
        • Partager sur Facebook
        • Partager sur Twitter
          25 août 2009 à 15:51:06

          Non mais tu code comme un porc c'est incroyable. :D Si tu codais correctement tu l'aurais vu... je te conseille de lire mon topic sur les conventions de codage!!!

          Sinon ton problème vient du fait que dans Fenetre tu fais une Affichage_arcades qui est une Fenetre. Donc dans le constructeur de Fenetre tu construis une Fenetre... capiche?
          • Partager sur Facebook
          • Partager sur Twitter
            25 août 2009 à 15:53:18

            Salut,

            je trouve que cela part un peu dans tous les sens. Deux classes suffisent largement. Une classe qui hérite de JFrame et une classe pour l'execution du programme.

            Tu auras donc une classe Affichage avec les méthodes suivante :
            • Un constructeur
            • Une méthode pour construire ta fenêtre (composants).
            • Une méthode pour afficher ce que tu souhaites.


            L'autre classe Principal, permettra d'instancier ta classe : Affichage mesJeux = new Affichage();

            Si tu souhaites garder 3 classes, on va pouvoir découper logiquement ton application selon les 3 points suivants :
            • Execution
            • Construction de ta fenêtre
            • Traitement des données relatif au coeur de ton application (affichage des jeux).

            • Partager sur Facebook
            • Partager sur Twitter
              25 août 2009 à 15:56:04

              Je lirais ce topic dont tu me parles ^^
              Heu mais on s'y retrouve, quand même, non ? oO
              J'ai résumé le code exprès en plus :( xD

              Bref alors, à la suite d'une très forte mobilisation de mes capacités mentales, j'en ai déduis que j'ai pas très bien compris, parce que dans Affichage_arcades, y a pas de fenêtre.... à part un héritage de Fenetre... heu on peut m'expliquer un peu mieux please ? :(

              Bein c'est plus lisible quand même...
              Et sinon, pour éviter ça, je pourrais mettre la variable panel de la classe Fenetre en "global" (c'est ce qui, d'ailleurs, est fait), mais ça sert à rien, Affichage_arcades refusait de comprendre ce qu'est cette variable :(:(
              • Partager sur Facebook
              • Partager sur Twitter
                25 août 2009 à 16:01:21

                Bon faisons plus simple...
                J'ai la classe Fenetre.
                J'ai la classe Affichage_arcades qui est une fenêtre étant donnée qu'elle hérite.

                Voilà ce que fais ton programme :

                Bon tu construis une Fenetre.
                Dans ce constructeur tu construis un Affichage_arcades.
                Quand tu construis un Affichage_arcades la première chose qui se passe c'est la construction d'une Fenetre
                Et là magique ça recommence... ad vitam eternam car la construction de la Fenetre entraîne celui d'Affichage_arcades qui entraine celle de Fenetre....
                • Partager sur Facebook
                • Partager sur Twitter
                  25 août 2009 à 16:03:26

                  lol, ça j'avais compris lol
                  Il n'empêche qu'en effet, c'est plus simple pour moi, merci ^^

                  Pour dod : les 3 étapes que tu m'a dites, en gardant les 3 classes ^^... bein c'est ce que j'ai fait non ? :euh:

                  Exécution: main
                  Construction de la fenetre: fenetre
                  Affichage des jeux: Affichage_arcades ??
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    25 août 2009 à 16:03:57

                    Citation : janulrich00001

                    Non mais tu code comme un porc c'est incroyable. :D Si tu codais correctement tu l'aurais vu... je te conseille de lire mon topic sur les conventions de codage!!!



                    Faudrait aussi de la lecture sur l'encapsulation et l'heritage parce que la...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 août 2009 à 16:05:30

                      Ok, je relirais ça ^^ mci ^^

                      Heu mais c'est pas une raison pour arrêter de m'aider sur ce problème là, hein xD
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 août 2009 à 16:37:27

                        Salut,

                        j'ai testé très rapidement mais voici un exemple de ce qui peut être fait. Bien évidemment il ya des choses à corriger, c'est un premier essai pour donner une idée générale. De plus, il y a également sûrement des fautes mais cela fonctionne relativement bien.

                        /*
                         * To change this template, choose Tools | Templates
                         * and open the template in the editor.
                         */
                        
                        package mesjeux;
                        
                        /**
                         *
                         * @author dod
                         */
                        public class Main
                        {
                        
                            /**
                             * @param args the command line arguments
                             */
                            public static void main(String[] args)
                            {
                                ConstructionFenetre maBorneArcade = new ConstructionFenetre();
                            }
                        
                        }
                        

                        //*
                         * To change this template, choose Tools | Templates
                         * and open the template in the editor.
                         */
                        
                        package mesjeux;
                        
                        import java.awt.BorderLayout;
                        import java.awt.Container;
                        import java.awt.event.ActionEvent;
                        import java.awt.event.ActionListener;
                        import java.awt.event.WindowAdapter;
                        import java.awt.event.WindowEvent;
                        import javax.swing.*;
                        
                        /**
                         *
                         * @author dod
                         */
                        public class ConstructionFenetre extends JFrame implements ActionListener
                        {
                        	private Container conteneur;
                        	private JPanel panneauDonnees, panneauBoutons;
                        	private JTextArea listeJeux;
                        	private JButton boutonValider;
                        	private DonneesJeux mesPetitsJeux;
                        
                        
                        	public ConstructionFenetre ()
                        	{
                        		initialisationFenetre();
                        		constructionComposants();
                        		initialisationEvenements();
                        		setVisible(true);
                        	}
                        
                        	public void initialisationFenetre ()
                        	{
                        		setSize(450,250);
                        		setTitle("Borne d\'arcades");
                        	}
                        
                        	public void initialisationEvenements ()
                        	{
                        		addWindowListener(new WindowAdapter()
                        		{
                        			public void windowClosing(WindowEvent evt)
                        			{
                        				System.exit(0);
                        			}
                        		});
                        		boutonValider.addActionListener(this);
                        	}
                        
                        	public void constructionComposants ()
                        	{
                        		conteneur = getContentPane();
                        
                        		panneauDonnees = new JPanel(new BorderLayout());
                        		panneauBoutons = new JPanel(new BorderLayout());
                        		listeJeux = new JTextArea();
                        		boutonValider = new JButton("Valider");
                        
                        		panneauDonnees.add(listeJeux);
                        		panneauBoutons.add(boutonValider);
                        		conteneur.add(panneauDonnees,"Center");
                        		conteneur.add(panneauBoutons,"South");
                        	}
                        
                        	public void insertionDonnees ()
                        	{
                        		mesPetitsJeux = new DonneesJeux("/");
                        
                        		listeJeux.setText(mesPetitsJeux.listeFichier());
                        	}
                        
                        	public void actionPerformed(ActionEvent e)
                        	{
                        		if (e.getSource() == boutonValider)
                        		{
                        			insertionDonnees();
                        		}
                        	}
                        }
                        


                        /*
                         * To change this template, choose Tools | Templates
                         * and open the template in the editor.
                         */
                        
                        package mesjeux;
                        
                        import java.io.File;
                        
                        /**
                         *
                         * @author dod
                         */
                        public class DonneesJeux
                        {
                        	private File ouvertureDossier;
                        	private File [] listeDossier;
                        	private String dossierAExploiter;
                        
                        	public DonneesJeux (String dossierAExploiter)
                        	{
                        		this.dossierAExploiter = dossierAExploiter;
                        	}
                        
                        	public File[] operationDossier ()
                        	{
                        		ouvertureDossier = new File(dossierAExploiter);
                        		listeDossier = ouvertureDossier.listFiles();
                        		return listeDossier;
                        	}
                        
                        	public String listeFichier ()
                        	{
                        		StringBuffer ensembleDossier = new StringBuffer();
                        
                        		for (File dossier : operationDossier())
                        		{
                        			ensembleDossier.append(dossier.getName() + "\n");
                        		}
                        		
                        		String ensembleJeux = new String(ensembleDossier);
                        		return ensembleJeux;
                        	}
                        }
                        


                        Edit : Oups oublié de détruire l'objet en mémoire.
                        Edit : avec quelques modifications sur le look and field, j'obtiens cela : image 1, image 2
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 août 2009 à 17:01:05

                          mesPetitsJeux = new DonneesJeux("/");

                          Cette instruction permet de spécifier directement le dossier à exploiter. Là, j'affiche uniquement la racine de mon mac. C'est à toi d'exploiter ensuite comme tu le souhaites.

                          C'est quand même assez explicite :

                          public DonneesJeux (String dossierAExploiter)
                          {
                          	this.dossierAExploiter = dossierAExploiter;
                          }
                          


                          Edit : c'est de la triche, tu as changé ton dernier message, ma réponse n'a donc plus de cohérence.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 août 2009 à 17:04:46

                            :lol: c'est parce que j'avais trouvé la solution xD
                            Merci encore ^^

                            Là, je fais en sorte que ce soit des boutons au lieu d'un textarea, donc je vais devoir créer dynamiquement des boutons via une boucle pour avoir TOUS les fichiers du dossier ^^ =D
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 août 2009 à 17:06:26

                              Pour créer des boutons dynamiquement, un validate est nécessaire pour le conteneur (donc le composant qui contient les éléments) ou un revalidate sur les boutons. Ces méthodes vont permettre de refaire les calculs relatifs au position du ou des composants (normalement ce sont ces méthodes).

                              Si tu penses que ton problème est résolu, peux-tu le placer en sujet résolu ? Merci

                              De manière générale, le fait de créer des boutons pour chaque jeu est un peu bizarre.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Boucle infinie d'héritage et d'instanciations de classes

                              × 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