2010-09-20 24 views
1

J'ai un code similaire à ce qui suit:Maintenir OO tout en utilisant les auditeurs en Java

public class myButton extends JButton() 
{ 
    public int data; 
    public myButton(){ 
     super("asdf"); 
     data = 2; 
    } 
} 

public class myPanel extends MouseListener() 
{ 
    myButton myButtonVar1; 
    myButton myButtonVar2; 
    public myPanel() 
    { 
     myButtonVar1 = new myButton(); 
     myPanel.add(myButtonVar1); 
     myButtonVar1.addMouseListener(this); 
     myButtonVar2 = new myButton(); 
     myPanel.add(myButtonVar2); 
     myButtonVar2.addMouseListener(this); 
    } 

    //MouseListener Methods are here 
    void mouseClicked(MouseEvent e) 
    { 
     //say this changes the myButton that was clicked data based off 
     //the other myButton's data 
     doSomething((myButton)(e.getSource()).data); 
    } 
} 

Et puis-je ajouter que le panneau à un JFrame via setContentPane.

Cela fonctionne bien. Le gestionnaire doit avoir accès à tous les boutons, car il doit connaître myButtonVar1.data et myButtonVar2.data

Cette configuration ne me convient pas, mais le problème principal est que je dois avoir d'autres boutons dans le cadre, qui accède aux myButtons.

Alors, comment pourrais-je nettoyer cela afin que je puisse ajouter quelque chose un "resetButton" qui réinitialiserait tous les myButtons contenues dans myPanel. L'itinéraire qui me parait le plus serait d'utiliser instanceof pour voir si la source est un resetButton ou myButton, mais cela semble être fortement déconseillé dans tout ce que j'ai vu.

J'espère que je ne suis pas trop loin ici. Mon but est d'écrire du bon code plutôt que de m'en tenir à ce que j'ai, alors laissez-moi savoir si j'ai déjà fait quelque chose de fondamentalement faux et que je devrais revenir en arrière.

+0

Dans 'doSomething ((myButton (e.getSource()). Data)' voulez-vous dire d'appeler un constructeur? Parce que 'myButton' n'a pas de constructeur à paramètre unique défini, et même s'il l'était, un' new' Ou est-ce que vous voulez dire effectuer une sorte de recherche? De plus, les parenthèses sont en déséquilibre –

+0

c'était une erreur, j'ai raté une parenthèse 'faireQuelque chose ((monBouton) (e.getSource()). – Kyle

+0

aha, maintenant que la fermeture de paren change l'image :-) –

Répondre

0

Les classes doivent commencer par une lettre majuscule (MyButton au lieu de myButton). C'est une convention.

Les champs sont généralement privés et vous n'avez qu'un getter (myButton.data).

instanceof est rarement nécessaire. Au lieu de cela, vous pouvez définir une classe de base avec une méthode "presse". Les deux classes pourraient alors l'implémenter.

+0

Oui, j'ai écrit ça rapidement, je suis normalement les conventions de capitalisation et j'utilise des accesseurs et des mutateurs mais je pensais que j'essaierais de le garder concis. Je devrais probablement avoir été plus prudent en demandant des conseils généraux. En ce qui concerne la méthode "presse", c'est ce qui semblait être la manière de le faire, le problème est que l'action en cours nécessite la connaissance des autres boutons, et ne peut donc pas être réalisée comme une méthode bouton. Je suppose que je pourrais passer dans le panneau du constructeur, ce qui me permettrait d'y accéder dans son intégralité. myButton (ceci); – Kyle

2

En général, vous pouvez résoudre votre problème en préférant la composition à l'héritage. Vos boutons ne doivent pas être des boutons de classe spéciale. Au lieu de cela, ils devraient être crus JButton s. Vous pouvez créer une classe qui renvoie un JButton avec les paramètres préférés et qui contient également les données, mais essayez de ne pas étendre les classes Swing. Pour votre problème d'encapsulation, ne rendez pas public data. Au lieu de cela, avoir un getter getData() pour obtenir la valeur au besoin.

Vous n'avez pas besoin d'utiliser instanceof. Au lieu de cela, installez deux MouseListeners différents - un pour vos boutons MyButton et un pour vos boutons ResetButton. Cela peut être fait avec des classes externes ou une classe interne privée qui implémente MouseListener. Tous les boutons de type MyButton auront le type d'écouteur, alors que le seul ResetButton aura l'autre.