Ecouteur après un héritage

yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013 - 26 févr. 2013 à 11:05
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 27 févr. 2013 à 10:37
Bonjour,

je suis entrain développer un logiciel en java.
Dans ce logiciel, je vais avoir des menus en haut et des sous-menu à gauche.
Ces Menu sont accessible à partir de boutons.

Vu qu'il va y avoir un certain nombre de fenêtres et que je ne veux pas écrire n fois le même code, je voudrai créer des classes qui correspondent à ces menu et sous menu.

J'ai créer une classe avec le menu et des écouteurs sur les boutons du menu. Si j'appelle cette classe, les boutons fonctionnent très bien.

Si j'appelle une classe qui hérite de celle-ci, l'affiche est bon, le menu apparait avec les boutons. Par contre les boutons ne régissent plus.

J'espère avoir été clair.

Savez-vous comment il faut faire pour résoudre ce problème ?

Je n'utilise peut-être pas du tout la bonne méthode. Dans ce cas, pourriez-vous m'éclairer ?

Merci.

9 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
26 févr. 2013 à 11:40
Salut,

Première remarque, il faut faire attention au niveau de la conception sur l'ihm. Autant pour le code métier, il est intéressant de faire de la conception assez poussée, mais attention, au niveau de l'ihm, en général, il vaut mieux rester basique et définir les éléments de ton interface de façon granulaire afin de ne pas introduire de trop fortes dépendances dans les éléments de ton ihm.

Au sujet de ton problème, je ne sais pas comment tu as définis tes écouteurs, peux tu nous montrer ton code.
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
26 févr. 2013 à 11:51
Merci pour la réponse.

Voici le code de la classe qui contient les menus :
J'aimerai ne pas avoir à réécrire ceci dans chaque classe correspondant à un affichage graphique.

public class TestIHM extends JFrame implements ActionListener {

private PanelImage panelFond = new PanelImage();
private PanelImage panelPrincipal = new PanelImage();
private PanelImage panelLateral = new PanelImage();
private PanelImage panelSup = new PanelImage();

private JCoolButton boutonMenuPrincipal = new JCoolButton("Menu principal");
private JCoolButton boutonMenuSecondaire = new JCoolButton("Menu Secondaire");

private JCoolButton boutonParametres = new JCoolButton("Paramètres");
private JCoolButton boutonAnalyse = new JCoolButton("Statistiques");
private JCoolButton boutonQuitter = new JCoolButton("Quitter");

private GridBagConstraints constraintsSup  = new GridBagConstraints();
private GridBagConstraints constraintsLateral  = new GridBagConstraints();



public testIHM()
{
this.setTitle(ParametresFenetre.version);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(ParametresFenetre.largeurFenetre, ParametresFenetre.hauteurFenetre);
        if(ParametresFenetre.ouverture == true) this.setLocationRelativeTo(null);	
        else this.setLocation(ParametresFenetre.emplacementLargeurFenetre,
ParametresFenetre.emplacementHauteurFenetre);	
        
        try {
panelFond.setImage("Ressources/Images/agriculture01.jpg");
        	} catch (IOException e) {
        	e.printStackTrace();
        	} 
        panelFond.setLayout(new BorderLayout());
        JScrollPane scrollPaneGeneral = new JScrollPane(panelFond);
this.getContentPane().add(scrollPaneGeneral);



panelPrincipal.setBorder(BorderFactory.createTitledBorder("Menu principal"));
        
        Dimension SizePanelLateral = new Dimension(150, 500);
        panelLateral.setPreferredSize(SizePanelLateral);
        Dimension SizePanelSup = new Dimension(900, 50);
        panelSup.setPreferredSize(SizePanelSup);
        
        panelFond.add(panelSup, BorderLayout.NORTH);
        panelFond.add(panelLateral, BorderLayout.WEST);
        panelFond.add(panelPrincipal, BorderLayout.CENTER);
        
        
////////////////////////////////////////////////////////////////////////////////////      
        
        panelSup.setLayout(new GridBagLayout());

constraintsSup.gridx = 0;
constraintsSup.gridy = 0;
constraintsSup.gridwidth = 1;
constraintsSup.gridheight = 1;
constraintsSup.ipadx = 300;
constraintsSup.ipady = 25;
constraintsSup.anchor = GridBagConstraints.LINE_END;
panelSup.add(boutonMenuPrincipal,constraintsSup);

        
        constraintsSup.gridx = 1;
constraintsSup.gridy = 0;
constraintsSup.gridwidth = 1;
constraintsSup.gridheight = 1;
        constraintsSup.anchor = GridBagConstraints.LINE_START;
panelSup.add(boutonMenuSecondaire,constraintsSup);



////////////////////////////////////////////////////////////////////////////////////		


panelLateral.setLayout(new GridBagLayout());
        
        Dimension SizeBoutonLateral = new Dimension(135, 60);


constraintsLateral.gridx = 0;
        constraintsLateral.gridy = 1;
constraintsLateral.gridwidth = 1;
constraintsLateral.gridheight = 1;
constraintsLateral.insets = new Insets(0,0,5,0);
boutonParametres.setPreferredSize(SizeBoutonLateral);
panelLateral.add(boutonParametres,constraintsLateral);

constraintsLateral.gridx = 0;
constraintsLateral.gridy = 5;
constraintsLateral.gridwidth = 1;
constraintsLateral.gridheight = 1;
constraintsLateral.insets = new Insets(0,0,40,0);
boutonAnalyse.setPreferredSize(SizeBoutonLateral);
panelLateral.add(boutonAnalyse,constraintsLateral);	

constraintsLateral.gridx = 0;
        constraintsLateral.gridy = 7;
constraintsLateral.gridwidth = 1;
constraintsLateral.gridheight = 1;
        constraintsLateral.weighty = 1;
constraintsLateral.insets = new Insets(0,0,20,0);
constraintsLateral.anchor = GridBagConstraints.PAGE_END;
boutonQuitter.setPreferredSize(SizeBoutonLateral);
panelLateral.add(boutonQuitter,constraintsLateral);


////////////////////////////////////////////////////////////////////////////////////


boutonMenuPrincipal.addActionListener(this);
boutonMenuSecondaire.addActionListener(this);

boutonParametres.addActionListener(this);
boutonAnalyse.addActionListener(this);
boutonQuitter.addActionListener(this);
}



public void actionPerformed(ActionEvent arg0) {

if(arg0.getSource() == boutonMenuPrincipal) 
   	 {		
this.dispose();
   	 	new MenuPrincipal().setVisible(true);			
   	 }
if(arg0.getSource() == boutonMenuSecondaire) 
   	 {	
   	 	new MenuSecondaire().setVisible(true);
   	 	this.dispose();	
   	 }

///////////////////////////////////////////////////////////////////////////

if(arg0.getSource() == boutonParametres) 
   	 {		
   	 	new Parametres().setVisible(true);
   	 	this.dispose();
   	 }
if(arg0.getSource() == boutonAnalyse) 
   	 {		
new Statistiques().setVisible(true);	
this.dispose();	   	 			
   	 }
if(arg0.getSource() == boutonQuitter) 
   	 {		
System.exit(0);
   	 }		
}
}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
26 févr. 2013 à 13:40
Est ce que dans la classe qui hérite de TestIHM tu ré-implémentes actionPerformed ?
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
26 févr. 2013 à 14:01
Voici le code de la classe testIHMDeux :
L'appui sur le bouton test fonctionne mais pas l'apppui sur les bouton de la classe TestIHM.

public class TestIHMDeux extends TestIHM implements ActionListener {

private JPanel panelTest = new JPanel();

private GridBagConstraints constraintsPrincipal  = new GridBagConstraints();
private GridBagConstraints constraintsTest  = new GridBagConstraints();

private JCoolButton boutonTest = new JCoolButton("Test");


public TestIHMDeux()
{		
TestIHM.panelPrincipal.setLayout(new GridBagLayout());

//		Color couleurTitres = new Color(70,130,180,255);

constraintsPrincipal.gridx = 0;
constraintsPrincipal.gridy = 0;
constraintsPrincipal.gridwidth = 3;
constraintsPrincipal.gridheight = 1;
        constraintsPrincipal.weighty = 1;
constraintsPrincipal.insets = new Insets(10,10,0,10);
constraintsPrincipal.ipadx = 300;
constraintsPrincipal.ipady = 10;
constraintsPrincipal.fill = GridBagConstraints.HORIZONTAL;

panelTest.setBorder(BorderFactory.createTitledBorder("Exploitations"));
panelTest.setOpaque(false);
panelPrincipal.add(panelTest,constraintsPrincipal);


panelTest.setLayout(new GridBagLayout());

Dimension SizeBoutonPanel1 = new Dimension(100, 40);
boutonTest.setPreferredSize(SizeBoutonPanel1);

constraintsTest.gridx = 0;
constraintsTest.gridy = 0;
constraintsTest.gridwidth = 1;
constraintsTest.gridheight = 1;
constraintsTest.weightx = 1;
panelTest.add(boutonTest,constraintsTest);

boutonTest.addActionListener(this);
}


public void actionPerformed(ActionEvent arg0) {

if(arg0.getSource() == boutonTest) 
   	 {		
System.out.println("Appui sur test !");
   	 }
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
26 févr. 2013 à 15:49
Oui, c'est bien ce que je disais, dans ce cas, c'est normal que ca ne fonctionne pas. Seule la méthode actionPerformed de TestIHMDeux est appelée, en effet, cette méthode remplace la méthode parente.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
26 févr. 2013 à 15:51
De toute facon, ton code n'était pas très propre, il faudrait que tu utilises les listeners de cette manière

boutonQuitter.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
      System.exit(0);
   }
});
boutonAnalyse.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
      new Statistiques().setVisible(true);	
      this.dispose();	 
   }
});


de manière à ne pas faire un switch sur la source
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
26 févr. 2013 à 15:53
Cette facon de faire est issue d'une ancienne version de swing où on ne pouvait définir les listeners que sur les fenêtres. Les versions plus récentes permettent de faire des choses bien plus propres avec des méthode modulaires.

Je ne sais pas pourquoi mais il y a pas mal de développeurs qui utilisent encore cette ancienne facon de définir les écouteurs...
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
27 févr. 2013 à 08:59
Merci.
Je ne suis pas bloqué à méthode. J'ai essayé ta méthode qui fonctionne très bien.

Par contre le this.dispose() n'est pas accepté :
The method dispose() is undefined for the type new ActionListener(){}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
27 févr. 2013 à 10:37
Oui, c'est normal, tu es dans une sous classe, il faut que tu utilises la méthode dispose de la JFrame, pour cela tapes TestIHM.this.dispose() ou TestIHM.dispose(), je ne sais plus laquelle des deux est la bonne.
0
Rejoignez-nous