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

Langage Java Discussion :

Problème d'héritage java


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut Problème d'héritage java
    Bonjour,

    Voici mon problème actuel:

    J'ai une classe qui hérite de JFrame et dans le constructeur je n'ai qu'un super(); et un appel a une fonction pour créer ma fenêtre.

    Ensuite je créé plusieurs onglets dont chacun fait appel a une fonction qui va créer le contenu de l'onglet.
    J'ai décidé de créer une nouvelle classe pour chaque onglet, chacune de ces classes héritent de la classe qui les appelle afin de pouvoir appeler la fonction repaint() puisque ma fonction paint est définie dans la classe parent.

    Le problème est qu'à la création d'une nouvelle instance de ces sous classe, le constructeur fait automatiquement appel au constructeur de la super classe ...
    Il me semblait qu'il fallait faire appel a la méthode super() pour que le constructeur de la super classe soit pris en compte.
    Pouvez vous me dire comment ignorer le constructeur de la super classe ?
    Si je ne peux pas, je m'y prendrais différemment.

    Le problème est que si je défini la fonction paint dans chacune de mes sous classe, elle n'est jamais appelé et je ne comprend pas pourquoi.

    Voici les bouts importants de mon 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
    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    //Classe principale
     
    public class EspFrame extends JFrame implements ChangeListener{ 
     
    private JTabbedPane Onglets = null;
     
     
    	private int paintSelect = 1;
     
    	public EspFrame(){
    		super();
     
    		build();//On initialise notre fenêtre
    	}
     
    private void build(){
    		setTitle("AT calcul"); //On donne un titre à l'application
    		setSize(650,700); //On donne une taille à notre fenêtre
    		setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
    		setResizable(false); //On interdit la redimensionnement de la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
    		setContentPane(getOnglets());
    	}
     
    	private JTabbedPane getOnglets()
    	{
     
    		if(Onglets== null)
            {
                try
                {
                    Onglets = new JTabbedPane(JTabbedPane.TOP);
                    Onglets.addTab("Tole", null, getOngletTole(), null); //
                    Onglets.addTab("Lettres Découpées", null, getOngletLettre(), null); //
                    //Onglets.addTab("Onglet 3", null, getOnglet3(), null); //
     
                    Onglets.addChangeListener(this);
     
                } catch (java.lang.Throwable e)
                {
                	System.out.println(e);
                    // TODO: Something
                }
            }
            return Onglets;
     
    	}
     
    	private JPanel getOngletLettre()
    	{
     
    		OngletLettre ongletL = new OngletLettre();
     
    		JPanel panel2 = ongletL.getPanel();
     
    		return panel2;
    	}
     
    	private JPanel getOngletTole(){
     
    		OngletTole ongletT = new OngletTole();
     
    		JPanel panel = ongletT.getPanel();
     
    		return panel;
     
    	}
     
    public void stateChanged(ChangeEvent arg0) {
    		// TODO Auto-generated method stub
     
    		int index;
    		index = Onglets.getSelectedIndex();
     
    		String composant = new String("");
    		composant = Onglets.getTitleAt(index);
     
    		if(composant == "Tole")
    		{
    			paintSelect = 1;
    			repaint();
    		}
    		if(composant == "Lettres Découpées")
    		{
     
    			paintSelect = 2;
    			repaint();
     
    		}
    	}	
     
    	public void paint(Graphics g) {
    		  super.paint(g);
     
    		  ATicon = new ImageIcon("C:\\Users\\publi auto\\Desktop\\Workspace\\ESP\\ESP\\ATCOULEUR.jpg");
    		  ATlogo = ATicon.getImage();
     
    		  g.drawImage(ATlogo, 500, 49, 125, 123, this);
     
    		  if(paintSelect == 1)
    		  {
    			  g.drawRoundRect(21, 185, 150, 80, 5, 5);
    			  g.drawRoundRect(222, 185, 360, 220, 5, 5);
    			  g.drawRoundRect(42, 450, 325, 75, 5, 5);
    			  g.drawRect(352, 275, 100, 50);
    		  }
    		  if(paintSelect == 2)
    		  {
     
    			  g.drawRect(150, 150, 150, 150);
     
    		  }
    	}
    }
     
    //1ere sous classe
     
    public class OngletTole extends EspFrame implements ActionListener, ItemListener, FocusListener {
     
    public OngletTole()
    	{
     
    	}
     
    	public JPanel getPanel()
    	{
     
    		panel = new JPanel();
     
    		panel.setLayout(null);
     
    		super.repaint();
     
    /* Tout plein de code */
     
             }
    }
     
    //2eme sous classe
     
    public class OngletLettre extends EspFrame implements ActionListener, ItemListener{
     
     
    	private JPanel panel;
    	private JLabel label;
    	private JTextField textFieldHauteurLettre;
     
    	public OngletLettre()
    	{
     
    	}
     
    	public JPanel getPanel()
    	{
     
    		panel = new JPanel();
     
                    //etc etc
            }
    }


    Le problème majeur dans tout ca, c'est que j'ai en quelque sorte une boucle infinie puisque la classe appelle la sous classe qui va rappeler la super classe =x

  2. #2
    Membre régulier Avatar de taha1
    Femme Profil pro
    débutantE ^ ^
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : débutantE ^ ^

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    Même si tu n'écris pas super() dans le constructeur de ta classe fille il le fera le compilateur, donc ça ne sera jamais ignoré.

    C'est une suggestion, pour des onglets pourquoi pas utilisé JPanel au lieu de JFrame comme ça au moins tu n'auras pas le problème de la boucle infinie.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Donc en faite, la seule solution c'est de ne pas faire de sous classe et de tout mettre dans la meme classe ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Gordon Freeman Voir le message
    Pouvez vous me dire comment ignorer le constructeur de la super classe ?
    On ne peux pas. Tout objet doit etre construit pour être utiliser, ca implique de passer dans le constructeur de base (Object) pour ensuite passer dans tous les constructeurs des enfant dans l'ordre d'héritage.
    Le problème est que si je défini la fonction paint dans chacune de mes sous classe, elle n'est jamais appelé et je ne comprend pas pourquoi.
    Ca n'a rien à voir avec la construction, à moins que tu fasse du code qui bloque dans ton construteur. Comment es-tu sur que la méthode paint() n'est pas appelée?
    Aussi, es-tu conscient des implications de setLayout(null) sur un JPanel?

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Le layout(null) me permet de placer mes composants comme je le souhaite. Je ne sais pas si il y a des grosses conséquences par la suite. Toujours est il que mon programme marche de cette facon :p

    Sinon pour la fonction paint dans mes sous classe, quand je l'avais testé, il n'y avait aucun dessin sur mon programme

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    commence par mettre des println() dans ta méthode. Tu verra qu'elle est appelée. Ensuite si rien ne s'afficeh c'est probablement que t'es en dehors du cadre.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    J'ai mis des System.out.println() dans ma fonction paint() et il n'y a toujours rien qui s'affiche. Aussi bien à la console que sur l'application.

    C'est ce que je trouve vraiment étrange, j'ai fait exactement comme dans mon autre classe donc je comprend pas pourquoi ca ne fonctionne pas :/

  8. #8
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    La boucle infinie se trouve dans ton constructeur, je ne pense pas que tu atteignes la fonction paint().

    Ce qui me chagrine c'est le fait que tes sous-classes étendent ta JFrame principal...
    Pourquoi? Quel est le sens de la manœuvre? Pourquoi pas des JPanels?

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    J'ai modifié ce détail, mes 2 classes n'héritent plus de ma classe principale puisque ca donne une boucle infinie des le constructeur.

    Mais pour que ma fonction paint() puisse fonctionner, il faut que mes classes héritent de JFrame non ?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Gordon Freeman Voir le message
    J'ai modifié ce détail, mes 2 classes n'héritent plus de ma classe principale puisque ca donne une boucle infinie des le constructeur.

    Mais pour que ma fonction paint() puisse fonctionner, il faut que mes classes héritent de JFrame non ?
    Non, tout classe étendant JComponent a un méthode paint(), c'est pas réservé aux JFrame. Et tes classe en base pour les onglet, fait lesd étendre JPanel directement au lieu de faire un méthode getPanel(). Ou alors tranfère tes méthode getPanel() ailleur parce que ces classes dans ce cas ne servent à rien.

    Et effectivement, désolé, j'avais pas vu la boucle infini. L'avantage c'est qu'il s'agit d'un récursion infinie -> ca s'arrête très vite à coup de Stack overflow

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Merci pour le conseil d'hériter de JPanel plutot que JFrame, j'ai fait les modifications et ca marche deja un peu mieux =)

    Cependant, j'ai un nouveau problème.
    Vu que mes 2 classes héritent de JPanel et que les fonctions de mes onglets doivent retourner un JPanel, je me suis contenté de créer une instance de mes classes et de faire un simple return. Dans mes classes, j'ai mis le code où je créé mes éléments et les affiche dans le constructeur de la classe.

    Pour ma première classe, je n'ai aucun problème: tout s'affiche et si j'entre des valeurs et que je lance les calculs, tout se fait normalement.
    Mon problème vient du 2eme onglet: Lorsque je clique sur celui-ci, aucun éléments ne s'affichent (je n'ai qu'un JTextField et un JLabel pour l'instant). De plus, le fond du JPanel de cet onglet est tout bleu et je ne comprend pas pourquoi. L'autre fait bizarre est que ma fonction paint fonctionne bien.
    Donc au final, sur mon 2eme onglet, j'ai un fond bleu, un rectangle noir et aucun composant.

    Voici le code important:

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    public class EspFrame extends JFrame implements StateChanged {
    	public EspFrame(){
    		super();
     
    		build();//On initialise notre fenêtre
    	}
    	private void build(){
    		setTitle("AT calcul"); //On donne un titre à l'application
    		setSize(650,700); //On donne une taille à notre fenêtre
    		setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
    		setResizable(false); //On interdit la redimensionnement de la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
    		setContentPane(getOnglets());
    	}
    	private JTabbedPane getOnglets()
    	{
     
    		if(Onglets== null)
            {
                try
                {
                    Onglets = new JTabbedPane(JTabbedPane.TOP);
                    Onglets.addTab("Tole", null, getOngletTole(), null); //
                    Onglets.addTab("Lettres Découpées", null, getOngletLettre(), null); //
                    //Onglets.addTab("Onglet 3", null, getOnglet3(), null); //
     
                    Onglets.addChangeListener(this);
     
                } catch (java.lang.Throwable e)
                {
                	System.out.println(e);
                    // TODO: Something
                }
            }
            return Onglets;
     
    	}
     
    	private JPanel getOngletLettre()
    	{
     
    		OngletLettre ongletL = new OngletLettre();
     
    		return ongletL;
    	}
     
    	private JPanel getOngletTole(){
     
    		OngletTole ongletT = new OngletTole();
     
    		return ongletT;
     
    	}
     
    }
     
    // Classe OngletLettre
    // C'est pour cette classe que le fond est Bleu et que rien ne s'affiche
     
     
    public class OngletLettre extends JPanel implements ActionListener, ItemListener{
     
     
    	private JPanel panel;
    	private JLabel label;
    	private JTextField textFieldHauteurLettre;
     
    	public OngletLettre()
    	{
     
    		this.setLayout(null);
     
    		try{
    			Insets insets = this.getInsets();
     
    			label = new JLabel("test");
    			this.add(label);
     
    			Dimension l1 = label.getPreferredSize();
    			label.setBounds(150 + insets.left, 150 + insets.top, l1.width, l1.height);
     
    			textFieldHauteurLettre = new JTextField(5);
    			this.add(textFieldHauteurLettre);
     
    			Dimension tf1 = textFieldHauteurLettre.getPreferredSize();
    			textFieldHauteurLettre.setBounds(150 + insets.left, 200 + insets.top, tf1.width, tf1.height);
    		}
    		catch(Exception e)
    		{
     
    			System.out.println(e);
     
    		}
    	}
    }
     
    //Classe OngletTole
    // C'est le panel qui s'affiche au démarrage et qui fonctionne normalement
     
    public class OngletTole extends JPanel implements ActionListener, ItemListener, FocusListener {
     
    	public OngletTole()
    	{
     
    		this.setLayout(null);
     
    		textFieldLarg = new JTextField(5);
    		textFieldHauteur = new JTextField(5);
    		labelLarg = new JLabel("Largeur");
    		labelHauteur = new JLabel("Hauteur");
     
                    //Tout le reste la création des composants
     
           }
    }
    La classe OngletTole contient beaucoup plus de code mais je ne pense pas que ce soit important pour mon problème actuel.


    Merci d'avance et merci a ceux qui suivent l'évolution de mon probleme =x

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    vu que tu as mis le layout à null, tes JPanel ont un minimumSize et un preferredSize() de 0, ce qui risque fortement de pertuber le tabbedpane qui ne saura pas alors quelle taille attribuer aux panneaux. Il est possible que, du coup il s'emelle un peu les pinceaux là dedans. De plus, on ne fait pas de setContentPane() sur un JFrame avec n'importe quoi. La doc de swing indique que tu dois absolument utiliser un conteneur opaque. Or un JTabbedPane n'est pas opaque par défaut.

Discussions similaires

  1. Héritage Java (problème avec la classe test)
    Par adil-01 dans le forum Général Java
    Réponses: 7
    Dernier message: 04/12/2011, 16h25
  2. Java : Problème d'héritage
    Par GérardMartinelli dans le forum Langage
    Réponses: 3
    Dernier message: 16/12/2009, 09h53
  3. [debutant][Applet] problèmes insertion applet java
    Par mlequim dans le forum Applets
    Réponses: 5
    Dernier message: 11/07/2005, 09h50
  4. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17
  5. [SQLPLUS] - Problème de Triggers Java
    Par farcis dans le forum Oracle
    Réponses: 7
    Dernier message: 23/12/2004, 09h21

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