OK, donc si j'ajouter un ActionListener
à un élément graphique, et il est le seul élément j'utilise ce ActionListener
avec, est-il important que des lignes suivantes (a, b) I utiliser pour obtenir l'état sélectionné checkbox?auditeurs d'action et les sources d'événements Swing
final JCheckBox checkbox = (JCheckBox)this.buildResult.get("cbDebugTick");
checkbox.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent event){
boolean bChecked =
// (a) checkbox.isSelected();
// (b) ((JCheckBox)event.getSource()).isSelected();
model.setPrintDebugOn(bChecked);
}
});
Il me semble logique que si j'ajoute l'objet ActionListener
à plusieurs éléments de l'interface graphique, alors je devrais utiliser (b).
Et (b), est-il correct de aveuglément jeté event.getSource()
-JCheckBox
, depuis que je suis celui qui a ajouté l'auditeur d'action, ou devrais-je faire défensivement et programmer une vérification instanceof
?
note: cette question est dans le contexte des écouteurs d'événements en général; kdgregory a quelques bons points ci-dessous spécifiquement re: cases à cocher que j'avais négligé de considérer.
pourriez-vous élaborer? pourquoi rediriger vers la classe externe si vous pouvez avoir accès aux mêmes méthodes/champs dans une classe interne anonyme? –
de cette façon vous pouvez facilement ajouter différents composants au même écouteur d'action et les traiter différemment et/ou polymorphiquement, rendant le code "meilleur" –
Je ne suis pas d'accord avec l'affirmation de David. Transférer un appel comme celui-ci va à l'encontre du découplage (c'est pourquoi une approche d'auditeur a été adoptée pour la notification d'événement dans Swing en premier lieu). Le cas idéal est celui où vous pouvez entièrement décomposer le comportement de l'action et utiliser l'action listener external à la vue qui contient le contrôle - dans ce cas, l'option (b) est la technique préférée. Cela dit, ce que vous * devriez * faire est de créer une Action et d'y attacher le contrôle. –