2009-05-10 9 views
0

Je fais un programme de dessin, et j'ai quelques questions à ce sujet.Faire un programme de dessin

J'ai besoin que l'utilisateur ait le choix de dessiner un rectangle, un ovale et une ligne. Je suppose que je dois faire une super classe dont ils dérivent tous. Dois-je en faire une interface ou un cours abstrait? Et comment dois-je configurer que toutes les formes ont des valeurs par défaut quand ils sont créés, comme la couleur, etc

L'utilisateur utilisera la souris pour cliquer sur l'écran, et le programme devrait faire la forme avec le centre où l'utilisateur clique et utilise la hauteur et la longueur précédemment saisies pour le dessiner. Quel est le moyen le plus simple de stocker des points rassemblés dans le cadre et dois-je même stocker ces informations?

Je voudrais aussi que l'utilisateur ait l'option de redimensionner la forme qu'il vient de tracer, en faisant glisser les côtés. Comment puis-je le configurer le plus facilement?

Modifier: À la vôtre. Je vais essayer avec un peu de lumière-weigth MVC. J'ai une classe DrawingModel et DrawingPanel que j'instancie dans View, puis passe l'objet DrawingModel à l'objet DrawingPanel via une méthode setModel. Une question cependant se pose, que je ne peux pas comprendre; quelle partie du programme devra prendre soin des auditeurs? Je suppose que je dois être implémenté par View, mais où dois-je placer les ActionListeners?

+0

Cela ressemble un peu à des devoirs, vous voudrez peut-être retagger si c'est le cas. – willcodejavaforfood

+0

De toute évidence, les écouteurs doivent être enregistrés avec une partie de la vue (par exemple JPanel.addMouseListener), mais les méthodes d'écoute elles-mêmes font partie du contrôleur. –

Répondre

2

Jetez un oeil à le modèle de conception MVC. Dans votre cas, vous devriez créer un objet modèle qui est une collection de formes.

Votre zone de dessin (par exemple une zone de dessin ou un panneau ou autre) doit implémenter MouseListener et MouseMotionListener afin de capturer les événements de souris. Vous pouvez savoir où l'utilisateur a cliqué en utilisant les méthodes getX() et getY() de MouseEvent. Vous pouvez ensuite stocker cette forme dans le modèle et repeindre() la zone. Pour la mise à l'échelle, vous devrez utiliser les méthodes mouseDragged() et mouseReleased() qui vous donneront les coordonnées x, y. Vous devez identifier la forme sur laquelle l'utilisateur a cliqué, puis modifier sa largeur et sa hauteur en fonction de la distance parcourue par l'utilisateur (cela peut être déterminé en soustrayant l'original x, y des nouvelles coordonnées x, y).

+0

Je suis d'accord c'est bon à savoir, mais/real/MVC est probablement exagéré pour ce qui ressemble à un petit projet d'école. –

3

Si vous voulez que toutes les formes aient des propriétés requises communes (et peut-être des méthodes), la classe abstraite est probablement le meilleur choix. Vous pouvez définir ces derniers dans la définition de classe abstraite:

abstract class AbstractShape 
{ 
    private static final Color DEFAULT_COLOR = Color.BLUE; 
    private static final float DEFAULT_LINE_WIDTH = .5f; 

    protected Color color = DEFAULT_COLOR; 
    protected float lineWidth = DEFAULT_LINE_WIDTH; 
} 

class Circle extends AbstractShape 
{ 

} 

EDIT: Juste pour clarifier, la classe abstraite peut avoir un constructeur, comme:

protected AbstractShape() 
{ 
    color = DEFAULT_COLOR; 
    lineWidth = DEFAULT_LINE_WIDTH 
} 
+0

Une meilleure alternative à la fourniture de constantes que vos sous-classes doivent explicitement faire référence est de définir un constructeur par défaut qui gère cela, quelles sous-classes peuvent remplacer si nécessaire. – sooniln

+0

Les affectations (color = DEFAULT_COLOR) peuvent facilement être déplacées vers un constructeur dans la classe abstraite, si vous le souhaitez. Toutefois, avec le code d'origine ci-dessus, les sous-classes peuvent déjà remplacer librement les données d'instance (color, lineWidth). –

1

Pour répondre à votre modification: C'est la vue qui aura l'ActionListener attaché aux composants. Ensuite, vous pourriez avoir la vue notifier le contrôleur (via un écouteur) si le modèle doit être mis à jour. Lorsque le modèle est mis à jour, il avertit généralement le contrôleur via un écouteur de modification de propriété afin que le contrôleur puisse mettre à jour la vue.

0

Vous voudrez peut-être google DerekBanas, il a quelques vidéos expliquant comment faire exactement cela. Il a également mis en ligne de superbes vidéos UML, design et autres objets liés à la conception orientée objet. J'ai fait un peu de code ces deux derniers jours qui va un peu plus loin que ses vidéos de tutoriel, utilisant d'autres formes et dessinant de meilleures lignes avec l'outil de peinture, etc. Si vous voulez consulter le code, envoyez-moi un message et je vais vous l'envoyer mais c'est trop pour poster dans un commentaire. Bonne chance.

Questions connexes