Bonjour,
Je voulais savoir si l'est possible de déplacer un Shape (carré rectangle ou autre ... ) vers d'autres ordonnées du JPanel
merci
Version imprimable
Bonjour,
Je voulais savoir si l'est possible de déplacer un Shape (carré rectangle ou autre ... ) vers d'autres ordonnées du JPanel
merci
Oui :D
Il suffit pour cela de créer une AffineTransform, de définir la translation/rotation/etc à appliquer et de l'appliquer à ta Shape.
merci j'aurai jamais trouvé !!
Sinon les graphics on une méthode translate qui fait parfaitement l'affaire.
voilà j'ai crée ma translation
ps : shapes1 est une liste de traits ...Code:
1
2
3
4 AffineTransform at = new AffineTransform(); at.setToTranslation(x,y); shapes1. et la ????
Tu appliques l'AffineTransform à tes Graphics2D (méthode setTransform) puis tu dessines normalement
je veux pas translater tout les Graphics
juste une List <Shape> du Graphics
Eclipse ne me
propose pas
d'ailleurs . ...Code:Shapes1.setTransform(at) ;
Tu crées une boucle parcourant ta liste de formes à dessiner et tu fais :
où g est ton objet Graphics.Code:g.draw(at.createTransformedShape(shapes1.get(i)));
on peut pas faire d'une liste de Shape une forme définitive ?
du genre
voilaCode:
1
2 Shape uneShapetout neuf = (Shape) monfragmentdeShape ;
c un peu tordu j'avoue
En fait pour faire une translation il faut faire le transform sur les Graphics (une liste n'a en aucun cas une méthode setTransform(), grrrr la javadoc ça sert à quoi:aie::aie::aie:???) dessiner les shapes sur lesquelles il y a translation puis faire la trasformation inverse.
Mais dans ton cas le plus simple n'est même pas de passer par une affineTransform mais de faire un bête translate:
Code:
1
2
3
4
5
6
7
8
9 //On fait une translation du contexte graphique mesGraphics2D.translate(x,y); for(int i =0; i<shapes1.size();i++) { //on dessine les shapes } //on remet le contexte graphique à l'initial mesGraphics2D.translate(0,0);
Ce code aura pour effet de dessiner tes shapes avec pour origine le point de translation et non plus 0,0 (c'est un simple changement de repère cartésien...
Et pour un forme custo il faut utiliser un GeneralPath
Comprends pas...Citation:
Envoyé par poulette3000
T'es pas obligé d'utiliser que des lignes, tu peux créer des rectangles, des cercles, des ellipses, ou des polygones (en utilisant un GeneralPath pour le polygone).
ça représente un graphique, un assemblage de DrawLine
et j'aimerai bien que à la fin se soit un bloc plutot que redessiner à chaque fois
Tu peux te créer un GeneralPath contenant plusieurs lignes indépendantes en utilisant les méthodes moveTo() et lineTo() de la classe GeneralPath => cf Javadoc ;)Citation:
Envoyé par poulette3000
juste une parenthèse sur la méthode de sinok
elle est pas un peu bourrin ta méthode ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 AffineTransform at = new AffineTransform(); at.setToTranslation(x,y); //On fait une translation du contexte graphique g2d.translate(-100,-100); for(int i =(int)(shapes1.size())/2; i<shapes1.size();i++) { for (FormeColoree shape1 : shapes1) shape1.dessiner(g2d); } //on remet le contexte graphique à l'initial g2d.translate(0,0);repaint();
ça me fait mon panneau tout gris ... et les trucs de derriere, les axes , les labels et tout sont derriere .....
Il suffit d'utiliser le translate à bon escient, juste au moment ou tu dois décaler les shapes spécifiques...
Sinon essayes sans le translate final
Parmis les methodes pour concatener une liste de Shape en une autre, tu peux au choix utiliser GeneralPath, Path2D ou Area qui disposent des methodes appropriees.
Pour le reste, cela depend vraiment de ce que tu veux faire :
-Desires-tu transformer definitivement tes Shape ? Dans ce cas AffineTransform.createTransformedShape() est la voie a suivre. Dans le cas de formes simples (Rectangle, Ellipse, etc...) il n'est meme pas besoin d'ailleurs de passer via AffineTransform pour faire la translation, ces classes disposent des methodes setRect(), setFrame(), setFrameFromCenter()... qui permettent de faire la meme chose "manuellement" et de garder le bon type de l'objet.
-Ou au contraire s'agit-il d'une transformation temporaire (ex : dans le cas d'un affichage) ? Dans ce cas mieux vaut laisser travailler le Graphics SAUF si ces transformations deviennent genantes au niveau du Paint utilise (ex : le positionnement de la texture ou du gradient est influence par la transformation) dans ce cas utiliser la 1ere solution et travailler sur une liste de formes transformees tout en gardant sous la main la liste des formes d'origine.
Juste 2 petites remarques (ça t'évitera de t'arracher les cheveux plus tard en te demandant pourquoi la moitié de ton dessin est décalée) :
- pour annuler un graphics.translate(x, y), il faut faire graphics.translate(-x, -y) et non graphics.translate(0, 0) comme dans ton code.
- appeler repaint() dans paintComponent, ça va te faire repeindre en permanence, et l'EDT va prendre beaucoup de CPU. Déjà, pour les performances de ton appli c'est pas génial, mais en plus c'est mauvais pour la planète.
pourquoi ça sera mauvais pour la planete ?
ça va prendre trop d'electricité au central nucleaire ?
Bah vi, pi en plus ton pc il va chauffer, ça va contribuer au réchauffement de la planète et à chaque fois que tu lanceras ton programme ça tuera un bébé panda... :cry:Citation:
Envoyé par poulette3000