2009-11-26 14 views
0

Je tente de créer une applet Java qui me permettra de dessiner une structure de données graphique dans un canevas. Je vais le faire en cliquant où je veux créer des nœuds, et en cliquant sur les nœuds pour les connecter. Le problème est que je ne peux pas obtenir la méthode paint() pour se comporter correctement. Ajouter de nouveaux noeuds au graphique (et les places sur la toile) à l'intérieur de la méthode mousePressed(MouseEvent e) utilisant,Rectangles graphiques Java 2D

Graphics g = this.getGraphics(); 
g.setColor(Color.blue); 
g.fillRect(e.getX(), e.gety(), 40, 40); 

Tout fonctionne très bien, jusqu'à ce que je redimensionnez la fenêtre, puis tous les rectangles remplis évanouis. J'ai remplacé la méthode de peinture par une méthode vide, mais la même chose se produit toujours. Je ne peux pas ajouter les commandes fillRect dans paint() parce que je ne sais pas quels rectangles existent jusqu'à ce que l'utilisateur interagisse avec lui en utilisant la souris.

Comment puis-je utiliser g.fillRect() dans les méthodes d'écoute de la souris et de les faire coller?

Répondre

6

Le problème est que l'endroit où vous dessinez n'est pas persistant. À tout moment, vous pouvez perdre tout ce que vous y avez attiré. La méthode paint (Graphics) est appelée quand cela arrive. Vous devrez soit repeindre l'image entière chaque fois que cela se produit, soit vous devrez mettre de côté une toile pour dessiner et copier le contenu dans les graphiques de votre applet si nécessaire.

Voici comment créer et dessiner une image:
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html

Ensuite, dans votre méthode de peinture, utilisez votre méthode drawImage Graphics (...) pour afficher l'image que vous avez créé.

+0

Cela a semblé la méthode la plus simple, j'ai créé une nouvelle image buffered puis j'ai dessiné toutes mes formes dessus, et j'ai juste fait que la méthode de peinture dessine l'image. Merci! – PherricOxide

+1

Pas de problème, même si vous devrez peut-être finir par repeindre, alors souvenez-vous des conseils de Kyl. (Aussi, souvenez-vous d'up-voter et "accepter" les réponses que vous aimez.) Je veux mes points de karma. :) – Gunslinger47

+1

Dans ce cas particulier, garder les données serait probablement une bien meilleure idée qu'une image tamponnée. Cependant, +1 pour obtenir les deux extrêmes. –

6

Je ne sais pas si je lis correctement, mais pourquoi ne pas simplement stocker l'emplacement du dernier clic dans une variable être peint plus tard, quand la méthode paint() est appelée?

+0

C'est la bonne réponse. 'mousePressed()' n'a pas besoin de faire sa propre peinture; il devrait simplement appeler 'repaint' et enregistrer les informations nécessaires pour que' paint() 'puisse faire son travail. –

+0

Ne devrais-je pas stocker les emplacements de tous les clics quelque part, et traverser cette liste quand je repeindre? Je comprends que paint() commence à partir d'une toile vide et part de là. – PherricOxide

+1

@PherricOxide: Oui, vous le feriez. Cependant, vous devrez faire cela peu importe la solution que vous choisissez. Vous ne pouvez pas supposer que la toile n'a pas besoin d'être repeinte. – kylc

0

Le graphique est temporaire. Quand une région se salit, elle sera repeinte. Le meilleur moyen est de créer un BufferedImage, de le peindre sur mousePressed et de repeindre l'appel.
Lorsque la peinture est appelée, dessinez l'image sur l'objet graphique transmis. De cette façon, vous n'avez pas besoin de stocker les Rectangles et vous avez un tampon qui améliorera les performances.