IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

déplacement d'un shape ? (translation surtout)


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut déplacement d'un shape ? (translation surtout)
    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

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Oui

    Il suffit pour cela de créer une AffineTransform, de définir la translation/rotation/etc à appliquer et de l'appliquer à ta Shape.

  3. #3
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut
    merci j'aurai jamais trouvé !!

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Sinon les graphics on une méthode translate qui fait parfaitement l'affaire.

  5. #5
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut et là comment je fais
    voilà j'ai crée ma translation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AffineTransform at = new AffineTransform();
    			at.setToTranslation(x,y);
    			shapes1. et la ????
    ps : shapes1 est une liste de traits ...

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu appliques l'AffineTransform à tes Graphics2D (méthode setTransform) puis tu dessines normalement

  7. #7
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut
    je veux pas translater tout les Graphics
    juste une List <Shape> du Graphics
    Eclipse ne me
    propose pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Shapes1.setTransform(at) ;
    d'ailleurs . ...

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Tu crées une boucle parcourant ta liste de formes à dessiner et tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.draw(at.createTransformedShape(shapes1.get(i)));
    où g est ton objet Graphics.

  9. #9
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut
    on peut pas faire d'une liste de Shape une forme définitive ?
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Shape uneShapetout neuf = (Shape) monfragmentdeShape ;
    voila
    c un peu tordu j'avoue

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    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???) 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  11. #11
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Et pour un forme custo il faut utiliser un GeneralPath

  12. #12
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par poulette3000
    on peut pas faire d'une liste de Shape une forme définitive ?
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Shape uneShapetout neuf = (Shape) monfragmentdeShape ;
    voila
    c un peu tordu j'avoue
    Comprends pas...
    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).

  13. #13
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut
    ç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

  14. #14
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par poulette3000
    ç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

  15. #15
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut sinok
    juste une parenthèse sur la méthode de sinok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    elle est pas un peu bourrin ta méthode ?
    ça me fait mon panneau tout gris ... et les trucs de derriere, les axes , les labels et tout sont derriere .....

  16. #16
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    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

  17. #17
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    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.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  18. #18
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    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.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  19. #19
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut
    pourquoi ça sera mauvais pour la planete ?
    ça va prendre trop d'electricité au central nucleaire ?

  20. #20
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par poulette3000
    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...

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/05/2015, 14h16
  2. Déplacement de shape
    Par julius1983 dans le forum Graphisme
    Réponses: 0
    Dernier message: 10/06/2014, 17h38
  3. [XL-2010] EVENEMENT - Détecter le déplacement d'une Shape par evenement
    Par arnaud.123 dans le forum Excel
    Réponses: 2
    Dernier message: 26/08/2013, 08h47
  4. [HTML 5] Canvas, Shape et Déplacement.
    Par Progi1984 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 29/11/2010, 15h51
  5. Limiter le déplacement de la souris
    Par el_bouleto dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2002, 23h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo