2009-06-04 7 views
2

Je dois utiliser un élément GUI qui dessine une image à une position d'écran spécifique. Si l'utilisateur sélectionne cette image, une bordure est dessinée autour de l'image. Maintenant, nous voulons inclure une autre bordure qui identifie les images avec une valeur spécifique pour l'utilisateur.Division du dessin d'un élément GUI

Au moment où l'élément regarde son état interne s'il est sélectionné, puis décide comment dessiner lui-même.

graphic.drawImage(icon, x, y, null); 
if (selected) { 
    drawBorder(); 
} 

Je n'aime pas l'idée d'en ajouter une autre sinon à cette méthode de dessin. J'ai pensé créer une nouvelle classe qui hérite du comportement de l'élément et écrase la méthode de dessin, mais cela signifie dupliquer tout le code sélectionné dans chaque classe héritée. Existe-t-il une bonne possibilité pour résoudre ce problème sans créer de sous-classe?

Répondre

1

Depuis que vous avez étiqueté cela avec des motifs de conception et vous semblez être à la recherche d'une approche orientée modèle, je suggère de jeter un oeil à la state pattern. L'exemple sur la page wikipedia mentionne même l'état de conservation tout en dessinant une interface graphique. Malheureusement, cela signifierait que vous deviez créer une autre classe avec des sous-classes et des méthodes surchargées.

Cela va-t-il changer quelque chose? C'est à dire. Pensez-vous réaliste que vous allez ajouter un nouveau comportement au dessin (par exemple, si l'utilisateur double-clique, dessine un autre type de bordure, si l'utilisateur clique droit, change la couleur de la bordure), ou est-ce cela? Si vous voyez plus de comportement ajouté, je pense que aller de l'avant et adopter une approche plus orientée objet est sage. Si c'est juste ces deux cas, je dirais simplement ajouter et else if déclaration.

+0

Je pense que vous avez raison. Sous-classer cela pour seulement deux ou trois comportements différents est une surcharge et si cela va changer plus tard, il peut être changé en une approche plus avancée. Pour l'instant j'essaye de changer le if si à un commutateur et le booléen choisi à une énumération indiquant quel comportement devrait être employé pour le dessin – Janusz

+0

Cela semble être une idée assez sage. Une fois qu'il devient trop ingérable, vous pouvez facilement refactoriser l'instruction switch pour utiliser une approche OO plus avancée. –

0

Qu'avez-vous contre if-else?

Il me semble moins logique de créer un nouvel objet pour l'élément sélectionné que de vérifier un indicateur dans la fonction de dessin.

0

une possibilité est de permettre à votre méthode drawBorder() pour prendre des paramètres:

private void drawBorder(boolean isSelected, boolean hasSpecialValue); 

cette méthode permet de déterminer quel type de frontière pour dessiner.