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

Graphisme Java Discussion :

[Dessin] Reset un graphic


Sujet :

Graphisme Java

  1. #1
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut [Dessin] Reset un graphic
    Bonjour,

    J'ai une image sur laquelle je dessine deux lignes quand on clique sur un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    final Cpicturebox map = new Cpicturebox("data/world.gif");
             ....
            btnMap.addActionListener(new ActionListener()
            {
                public void actionPerformed(final ActionEvent arg0) {
     
                      Graphics g = map.getGraphics();
     
                      ImageIcon myBg = new ImageIcon("data/world.gif");
     
                      g.drawImage(myBg.getImage(), 0, 0, null);
     
                      String lat = txtMappingLatitude.getText();
                      String lon = txtMappingLongitude.getText();
                      // horizontale line
                      g.drawLine(0,Integer.parseInt(lat)+153, 500, Integer.parseInt(lat)+153);
     
                      //vertical line
                      g.drawLine(Integer.parseInt(lon)+250,0, Integer.parseInt(lon)+250,307);
                }
            });
    ca marche super bien. mais maintenant quand on reclique sur le bouton j'aimerai retourner l'image à son etat d'origine ou enlever les deux lignes.
    je pensais qu'il fallait annuler le graphic ou en définir un nouveau, mais ca semble pas marche, ca dessine les nouvelles lignes mais les vieilles lignes sont toujours là

    que puis-je faire?

    merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Par défaut
    Bonsoir!!

    Tu peux toujours essayer avec la méthode clearRect( int coordX, int coordY, int largeur, int hauteur) de Graphics.

  3. #3
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    pas bete , la description me semblait bizarre (remplir avec la couleur actuelle "current drawing color").
    le probleme c'est que je suis dans un gif et ca me dessine du gris bizarre et j'aurais eu besoin de garder la transparence ou au moins de pouvoir specifier telle ou telle couleur (qui aille avec le fond de ma fenetre)
    un g.setColor() definit la couleur des lignes mais le ClearRect me donne tjs un fond gris

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Par défaut
    Même si tu fais un setColor(..) de la couleur du fond désirée juste avant d'utiliser clearrect(..)?

    Je suis pas trop en position pour tester désolé

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     g.setColor(Color.RED);
                      g.clearRect(0,0,500,307);
    g.drawLine(0,-Integer.parseInt(lat)+153, 490, -Integer.parseInt(lat)+153);
    => fond gris
    => lignes rouges

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Selon le javadoc de clearRect :
    Beginning with Java 1.1, the background color of offscreen images may be system dependent. Applications should use setColor followed by fillRect to ensure that an offscreen image is cleared to a specific color.
    Comme ça y'a pu qu'à, non ?

  7. #7
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    ahh j'y ai cru une demi seconde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g.setColor(new Color(255,0,0,0)); => rouge mais 100% transparent
                      g.clearRect(0,0,500,307);
                      g.fillRect(0,0,500,307);
    quoi qu'il se passe, ca met le fond gris du clearRect(). donc j'ai opté pour un fond opaque similaire à l'arrière de ma fenetre. c'est pas ce que je voulais mais bon, ca ira.

    merci à vous deux

  8. #8
    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
    Euh tite question toute bête, ta Cpicturebox hérite de quoi?

  9. #9
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Cpicturebox extends JComponent {
           private ImageIcon myBg;
     
          public Cpicturebox(final String pathBackground) {
                  this.myBg = new ImageIcon(pathBackground);
                  this.setBounds(0,
                                 0,
                                 this.myBg.getIconWidth(),
                                 this.myBg.getIconHeight());
               }
     
               public final void paintComponent(final Graphics g) {
                   g.drawImage(myBg.getImage(), 0, 0, null);
            }
    }
    c'est le seul moyen de j'ai trouvé de placer une image à partir d'une ressource locale et ce, facilement. (et encore j'ai pris ce code sur le net je sais plus où )

  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
    Bon en faitTon problème est un peu ailleurs.

    Toute la ligique de dessin des JComponent doit se trouver dans la méthode paintComponent, et pas en dehors.

    Pour l'instant ce que tu fais ne dessine qu'une fois tes lignes, et ce dessin sera écrasé au prochain repaint....

    Donc pour faire propre

    Il te suffirait de mettre un état particulier à tà CPictureBox lui permettant de savoir si elle doit dessiner les lignes ou pas.

    Dans ton cas la classe donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    public class Cpicturebox extends JComponent {
          private ImageIcon myBg;
          private boolean drawLines = false;       
     
          public Cpicturebox(final String pathBackground) {
                  this.myBg = new ImageIcon(pathBackground);
                  this.setBounds(0,
                                 0,
                                 this.myBg.getIconWidth(),
                                 this.myBg.getIconHeight());
          }
     
          public final void paintComponent(final Graphics g) {
                   g.drawImage(myBg.getImage(), 0, 0, null);
                   if( drawLines ) {                  
     
                      String lat = txtMappingLatitude.getText();
                      String lon = txtMappingLongitude.getText();
                      // horizontale line
                      g.drawLine(0,Integer.parseInt(lat)+153, 500, Integer.parseInt(lat)+153);
     
                      //vertical line
                      g.drawLine(Integer.parseInt(lon)+250,0, Integer.parseInt(lon)+250,307);
                   }
          }
     
          public void setDrawLines(boolean drawLines) {
                  this.drawLines = drawLines;
                  repaint();
          } 
     
    }

    Ensuite il ne te reste plus qu'à jouer sur la valeur de drawLines.


    Pour faire encore plus propre en fait il te faudrait une collection d'objets à dessiner et que la méthode paintComponent les bouffe les uns après les autres sans distinction.

  11. #11
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Pour l'instant ce que tu fais ne dessine qu'une fois tes lignes, et ce dessin sera écrasé au prochain repaint....
    effectivement j'avais pas pensé à ca et quand je change d'onglet, ca reset l'image mais limite je peux jouer sur ca pour reset l'image :p

    par contre, j'ai pas vraiment le temps de creuser plus car je maitrise pas du tout les composants personnalisés et cette classe est utilisée par des dizaines d'images de mon appli qui servent juste pour un logo ou autre par exemple.

  12. #12
    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
    Dans ce cas il te suffirait juste de créer une sous classe de ta CPictureBox faisant dans son paintComponent un appel à super.paintComponent (donc l'image serait toujours affichée) puis faisant du dessin suivant certaines conditions, ie une variable booléenne comme je l'ai fait par exemple

    Rien de bien exceptionnel, et là tu aurais quelquechose d'un peu plus compréhensible. car le getGraphics n'est en général pas franchement recommandé pour faire du dessin.

  13. #13
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Sinon, pour "reseter" une image on peut faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Graphics2D g2 = image.createGraphics();
    g2.setComposite(AlphaComposite.Clear);
    g2.fillRect(0, 0, image.getWidth(), image.getHeight());
    Mais une approche par "layers" telle que proposée par sinok sera tout aussi simple et plus flexible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/03/2012, 16h28
  2. déplacer un dessin fait avec 'graphics'
    Par natha31 dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 15/10/2010, 03h23
  3. Dessiner sur le Graphics d'une JFrame
    Par magikk dans le forum Débuter
    Réponses: 3
    Dernier message: 23/04/2010, 16h53
  4. Impossible de dessiner Image avec Graphics sur pictureBox
    Par Arnard dans le forum Windows Forms
    Réponses: 11
    Dernier message: 14/12/2007, 15h06
  5. Réponses: 7
    Dernier message: 04/06/2006, 18h00

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