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

AWT/Swing Java Discussion :

[Débutant] reconnaitre la provenance des ActionEvent


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut [Débutant] reconnaitre la provenance des ActionEvent
    bonjour

    j'utilise pour mon application SWING un menu (MenuBar) composé d'Item (MenuItem), j'ai aussi des boutons (JButton) et d'autres choses qui ont des Listener ...

    Mon problème est que je ne sais pas comment reconnaitre d'où provient la source dans mon actionPerformed


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void actionPerformed(ActionEvent e) {
     
    ??
     
    }


    quelqu'un pourrait m'aider ?

  2. #2
    Membre averti Avatar de piff62
    Inscrit en
    Décembre 2003
    Messages
    431
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2003
    Messages : 431
    Points : 417
    Points
    417
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(e.getSource() == lesNomsDeTesDifferentsBouttonOuAutre )
    {
      actionAssosieACeBoutton();
    }

  3. #3
    Membre régulier Avatar de jiraiya
    Inscrit en
    Mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    si tu utilises SWING utilise plutot des JMenuBar et des JMenuItem

  4. #4
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par piff62
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(e.getSource() == lesNomsDeTesDifferentsBouttonOuAutre )
    {
      actionAssosieACeBoutton();
    }
    piff62 : si je fais ça il faut que mes bouttons ou autres soit defini en tant qu'attribut de ma classe !! et ce n'est pas le cas dans mon application. si je n'ai que des bouttons je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JButton button = new JButton("-- ajouter -->");
            button.setName("add")
    et dans le actionPerformed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( ((Component)e.getSource()).getName().equals("add")){
     
    ...
     
    }
    comment je fais dans le cas des Menu et MenuItem ??





    Citation Envoyé par jiraiya
    si tu utilises SWING utilise plutot des JMenuBar et des JMenuItem
    jiraiya : ok je vais essayer mais comment tu fais des "setShortcut" ???

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Un exemple de JMenuItem avec listener "intégré" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    JMenuItem quitterItem = new JMenuItem("Quitter");
            quitterItem.setMnemonic(KeyEvent.VK_Q);
            quitterItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK));
            quitterItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    System.exit(0);
                }
            });
    Nicolas

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    merci nicolas pour le raccourci clavier ça marche !!

    ça marche nikel sauf que je lui ajoute un ActionListener que j'ai crée et qu'il faut que je le reconnaisse dans le actionPerformed.

    cf question précédente...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Je ne suis pas sur de bien avoir compris ton problème.

    Dans ton ActionListener personnel, tu peux récupérer le texte de l'élément de menu cliqué en utilisant getSource() puis getText() ou getActionCommand() (à condition pour ce dernier d'avoir fait un setActionCommand lors de la création du JMenuItem).

    Nicolas

  8. #8
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    mon problème est que je ne peut faire un getSource() puis getText() uniquement sur un JMenuItem ! non ??

    getSource() renvoit un Objet.

    Comment savoir si l'action provient d'un JMenuItem, d'un JButton ou autres ??

    avec un instanceOf ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Si tous tes objets étendent AbstractButton (c'est le cas pour les JButton et les JMenuItem), il suffit de caster le résultat de getSource() en AbstractButton, et de comparer getText() ou getActionCommand() avec ce que tu veux, puisque ces deux dernières méthodes existent dès AbstractButton.

    Nicolas

  10. #10
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    oki thx nicolas !!

    mon prob est résolu !!

  11. #11
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    j'ai un autre problème :

    j'ai fait des "setActionCommand" pour mes boutons, pour mescheckbox et pour chaque menuItem (ce sont tous des "AbstractButton"). Mais comment récupérer ces AbstractButtons ??

    il n'y a pas de methode maJFrame.getComponentByActionCommand ??

    en fait j'ai un JRadioButton et un JCheckBoxMenuItem et je voudrais que quand on clique sur l'un des 2, l'autre soit aussi activé.

    comment savoir si un JCheckBoxMenuItem est activé ou pas ? (je précise qu'ils ne sont pas déclaré en globale)


    pouvez vous m'aider ??


    merci

  12. #12
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut

  13. #13
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    et qu'est ce qui t'empeche de les mettre en globale dans ta classe ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  14. #14
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    j'ai beaucoup de bouton, d'itemMenu, de checkbox, ... ça ferait un peu lourd !!!

    et j'ai dans ma jframe plusieurs éléments qui implements actionListener, et je voudrais appelé une méthode actionPerformed globale pour tous.


    j'ai vu qu'avec : maJFrame.getJMenuBar().getMenu(0).getItem(0) je pouvais récupérer un certain item d'un menu.

    mais comment faire avec les bouttons de l'application ???


    merci

  15. #15
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par lipao17
    j'ai vu qu'avec : maJFrame.getJMenuBar().getMenu(0).getItem(0) je pouvais récupérer un certain item d'un menu.
    Attention, mauvais code !!!

    Qui te dit que ce menu existe ? Tu risque de lever pas mal de NullPointerException en faisant de cette manière. Par ex., si tu supprime un menu de ton application mais que tu oublie de changer dans les écouteurs, ça va marcher à la compilation mais tu auras une erreur à l'exécution, qui sera peut-être beaucoup plus difficile à identifier !!

    Moi je me pose une question: pourquoi tu refuse d'avoir des classes qui contiennent beaucoup de champs ? Chez moi, quasiment chaque composant swing de mes JFrame possède son propre champ d'instance et sa propre méthode d'initialisation ! (sauf peut-être les JLabel complètement figés) et comme ça, même si mon GUI est assez chargé, le code reste centralisé dans une seule classe et facile à lire

    Je te conseille de garder sous forme de champs de class chacun de tes menuItem & autres boutons
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  16. #16
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    oki si y a pas d'autres soluces ...


    je vais tester ce que tu dis. ça donnerai un truc comme ça :
    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
    public class EditorGUI extends JFrame implements ActionListener{
    	private JMenuItem itemQuitter;
    	private JMenuItem itemSave;
    	...
     
    	private static void initItemQuitter(){
    		itemQuitter=new JMenuItem("Quitter");
    		itemQuitter.setActionCommand("quitter");
    		itemQuitter.setMnemonic('Q');
    		itemQuitter.setAccelerator(KeyStroke.getKeyStroke('Q', Event.CTRL_MASK));
    		itemQuitter.addActionListener(this);
    	}
     
    	private static void initItemSave(){
    		...
    	}
     
    	public EditorGUI() {
    		initItemQuitter();
    		initItemSave();
    		JMenuBar menuBar=new JMenuBar();
    		setJMenuBar(menuBar);  
    		JMenu menuFichier=new JMenu("Fichier");
    		menuFichier.setMnemonic('F');
    		menuBar.add(menuFichier);
    		menuFichier.add(itemQuitter);
    		...
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		...
    	}
    }

    :

  17. #17
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    oui, c'est presque ça (sauf que les méthode d'init ne sont pas static)

    tu peux encore améliorer en utilisant l'initialisation paresseuse, afin de n'initialiser ton composant que si cela n'a pas encore été fait, et aussi en retournant une référence au lieu de void:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private Component monCompo=getMonCompo();
    //...
     
    private Component getMonCompo(){
      if(monCompo==null) {
        monCompo = new JPanel();
        monCompo.fairequelquechose();
      }
     
      return monCompo;
    }
    et là tu te retrouve avec un code un peu plus robuste: tu as réuni en une seule méthode celle qui initialise ton composant et celle qui en retourne la référence. C'est un code que je trouve assez plaisant et subtil, que j'utilise dès que l'occasion se présente.

    La dernière faille qu'il y ait, c'est dans le cas du multi-threading: si tu utilise plusieurs threads qui accèdent à ces composants, il faut synchroniser les méthodes d'initialisation.

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  18. #18
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 72
    Points : 41
    Points
    41
    Par défaut
    Je te remercie j'ai fait comme t'as dit !


    merci à tous !!!!

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

Discussions similaires

  1. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  2. [Débutant] Démarrage et arrêt des services Oracles
    Par PaulBilou dans le forum Oracle
    Réponses: 13
    Dernier message: 12/08/2005, 18h38
  3. Réponses: 5
    Dernier message: 19/08/2004, 11h11
  4. Réponses: 3
    Dernier message: 14/02/2004, 10h10
  5. Réponses: 3
    Dernier message: 09/01/2004, 14h37

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