2009-02-26 4 views
0

J'ai un programme Java où j'ai un JMenu avec un nombre arbitraire d'éléments (dans ce cas, il y a un élément de menu pour chaque bibliothèque dynamique actuellement chargée dans un programme différent). Je cours une boucle pour ajouter JCheckBoxMenuItem s au menu, puisque je ne sais pas combien il y aura.Comment puis-je déterminer quel élément de menu appelé ActionListener?

Comment puis-je configurer un programme d'écoute d'action pour ces éléments de menu qui connaît l'option appelée? Spécifiquement, je veux exécuter la même fonction mais avec un ensemble différent ou des paramètres différents pour chacun des articles de menu (et une fonction différente encore selon que la vérification est basculée ou détournée).

Quelqu'un pourrait-il me diriger dans la bonne direction?

Répondre

2

Même si event.getSource() vous indiquera clairement de quel bouton provient l'événement, il aura pour effet secondaire de devoir suivre les boutons générés ou de naviguer dans le bouton. Aussi, vous pouvez vouloir présenter un nom différent de la bibliothèque à l'utilisateur (en incluant éventuellement les informations de version) que celui utilisé pour identifier la bibliothèque. L'utilisation de la propriété "ActionCommand" du bouton peut fournir un moyen de séparer ces problèmes. Vous devrez donc modifier le code dans la génération des éléments de menu de la case à cocher et dans l'écouteur.

ActionListener actionListener = ... // whatever object holds the method, possibly this 
String[] libraries = ... // however you get your library names 
JMenu parentMenu = ... // the menu you are adding them to 

for (String s : libraries) { 
    // prettyName is a method to make a pretty name, perhaps trimming off 
    // the leading path 
    JCheckBoxMenuItem child = new JCheckBoxMenuItem(prettyName(s), true); 
    child.setActionCommand(s); 
    parentMenu.acc(child); 
} 

Le code du gestionnaire d'action serait ...

public void actionPerformed(ActionEvent evt) { 
    // the 'current' selection state, i.e. what it is going to be after the event 
    boolean selected = ((JCheckBoxMenuItem)evt.getSource()).isSelected(); 
    String library = evt.getActionCommand(); 
    ... process based on library and state here... 
} 
1

event.getSource() devrait le faire.

1

Lorsque vous construisez le menu, vous pouvez passer l'objet Action au JCheckBoxMenuItem configuré avec les options dont vous avez besoin pour une action donnée (vous pouvez également appuyer sur la référence à la case à cocher pour vérifier l'état). De cette façon, vous n'aurez à effectuer aucun traitement lorsque l'action est réellement exécutée, car l'action correcte sera invoquée.

0

La manière propre de le faire est de créer un ActionListener différent pour chacun. EventObject.getSource est fugly.

+0

Bien sûr, mais comment puis-je appeler chaque ActionListener avec des paramètres qui sont inconnus au moment de la compilation? – Zxaos

Questions connexes