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 :

Swing Paint : setComposite()


Sujet :

AWT/Swing Java

  1. #1
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut Swing Paint : setComposite()
    Bonjour,

    Je cherche l'option graphique permettant de faire disparaitre un trait ou une forme lorsque que l'on la redessine par dessus ?

    D'avance merci

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Bonjour,

    Ne serait-ce point setXORMode(color) ?

  3. #3
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Merci camarade, mais la ligne ne s'efface pas...

    voici le code testé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public void paintComponent(Graphics g) {
            super.paintComponent(g);       
            Graphics2D g2 = (Graphics2D) g ;
            g2.setColor(Color.black);
            g2.setStroke(new BasicStroke(3.0f));
            g2.drawLine(1,10,100,10);
            g2.drawLine(1,20,100,20);
            g2.setXORMode(Color.black) ;
            // cette ligne devrait effacer la précédente...
            g2.drawLine(1,20,100,20);
        }

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    je pense que c'est ce que tu cherches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g2.setComposite(AlphaComposite.Clear);
    g2.fillRect(0, 0, image.getWidth(), image.getHeight());

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Je cherche a effacer le dessin précédent, en l'occurrence la dernière ligne tracée dans mon exemple, en la retraçant par dessus...

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Il me semble que cela est plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2.setXORMode(getBackground());

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par visiwi Voir le message
    Il me semble que cela est plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2.setXORMode(getBackground());
    Mieux !
    mais si le fond est complexe (genre dégradé...) ?

  8. #8
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Le XOR mode applique un algo en fonction de la couleur passé en param, ta ligne est en fait redessiné, pas effacé. Si le fond est de la même couleur que celle passé en param la conséquence est que ta ligne semble effacer. Mais si ton fond comporte plusieurs couleur, le XOR ne répond plus a ton attente.

    Peut-être alors stocké la partie du fond avant de dessiné dessus ? Et de la redessiner pour effacer ta ligne !

  9. #9
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Intéressant. Comment "sauvegarder" une surface (disont rectangulaire) pour la redessiner ensuite ?

  10. #10
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Je ne sais comment. Dans la FAQ tu as une méthode pour sauvegarder la totalité du dessin d'un composant.
    http://java.developpez.com/faq/gui/?...imageComposant

    Mais il doit-être possible de ne stocker qu'une toute petite partie. Je suis pas suffisamment à l'aise avec les images et les Graphics pour te donner la solution.

  11. #11
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par visiwi Voir le message
    Mais il doit-être possible de ne stocker qu'une toute petite partie. Je suis pas suffisamment à l'aise avec les images et les Graphics pour te donner la solution.
    Je pense qu'en fixant la zone de clip du Graphics, il ne stockera que la "petite partie".

  12. #12
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Merci à tous. Je vais renifler cette piste

    ... dans l'excellent bouquin de Romain Guy

  13. #13
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Après quelques recherches, il s'avère que j'arrive à copier le contenu d'une image dans une autre, et a la ré-afficher en position 0,0.
    Cependant, je ne sais pas copier une partie de l'image seulement, par exemple la partie x=10, y=10, width=100, height=20 d'une image en 0,0,200,200, pour la ré-afficher ensuite aux mêmes coordonnées.

    Quelqu'un a t-il une idée ?

  14. #14
    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
    Utilises une des variantes de la méthode drawImage qui précise quelle partie de l'image dessiner et où la dessiner

    Citation Envoyé par javadoc
    drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
    Draws as much of the specified area of the specified image as is currently available, scaling it on the fly to fit inside the specified area of the destination drawable surface.

  15. #15
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Peut-être ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bufferedImage.getSubimage()

  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
    Citation Envoyé par herve91 Voir le message
    Peut-être ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bufferedImage.getSubimage()
    En général mieux vaut passer par le drawImage que par le getSubimage, car celà évite de créer une image supplémentaire

  17. #17
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par sinok Voir le message
    Utilises une des variantes de la méthode drawImage qui précise quelle partie de l'image dessiner et où la dessiner
    Alors là, je voudrais dire que, Bravo
    c'est clair, t'es superbement pourrave

  18. #18
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Bonjour,

    Je crois avoir une autre solution qui permet d'obtenir directement une partie graphique d'un composant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D gSaved = image.createGraphics();
    gSaved = (Graphics2D)l.getGraphics().create(x,y,w,h);
    Voici un exemple (clic sur "capture", puis sur "dessiner capture") :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
     
     
    public class Go2 implements ActionListener {
    	boolean active = false;
    	BufferedImage image = null;
    	BufferedImage image2 = null;
    	JButton btn = new JButton("capture");
    	JButton btn2 = new JButton("dessiner capture");
    	MyJLabel l;
     
    	int x = 25;
        int y = 25;
        int w = 100;
        int h = 5;
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		new Go2();
    	}
     
    	public Go2() {
    		javax.swing.JFrame f = new JFrame();
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		l = new MyJLabel();
    		l.setPreferredSize(new Dimension(150,150));
    		l.setOpaque(true);
    		f.add(l, BorderLayout.NORTH);
    		f.add(btn, BorderLayout.CENTER);
    		f.add(btn2, BorderLayout.SOUTH);
    		btn.addActionListener(this);
    		btn2.addActionListener(this);
    		f.pack();
    		f.setVisible(true);
    	}
     
     
    	class MyJLabel extends JLabel {
    		public void paintComponent(Graphics g) {
    	        super.paintComponent(g);       
    	        Graphics2D g2 = (Graphics2D) g ;
    	        g2.setColor(Color.black);
    	        g2.fillRect(x,y,w,h);
    	        g2.setColor(Color.RED);
    		    if (active) {   
    		        int width = getWidth();
    		        int height = getHeight();
    		        g2.fillRect(0, 0, width, height);
    	        }
    	    }
    	}
     
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource() == btn) {
    			image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    	        Graphics2D gSaved = image.createGraphics();
    	        gSaved = (Graphics2D)l.getGraphics().create(x,y,w,h);
     
    	        active = true;
    	        l.repaint();
    		}
    		else {
    			l.getGraphics().drawImage(image, x, y, image.getWidth(), image.getHeight(), null);
    		}
    	}
     
    }

  19. #19
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    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 913
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par sinok Voir le message
    En général mieux vaut passer par le drawImage que par le getSubimage, car celà évite de créer une image supplémentaire
    Ou ca ? On a bien un nouvel objet Image mais ses donnees sont partagees avec son image mere.

    Citation Envoyé par javadoc
    public BufferedImage getSubimage(int x,
    int y,
    int w,
    int h)

    Returns a subimage defined by a specified rectangular region. The returned BufferedImage shares the same data array as the original image.
    Cependant, drawImage() est certes plus rapide.
    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

  20. #20
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Mon but est d'afficher des cadres sur un fond qui peut être un dégradé. Lorsque le cadre à un titre, je dois donc réserver une partie du cadre pour y afficher ce titre, sans effacer le dégradé en arrière plan. Mon cadre est dessiné dans sa méthode paint(), indépendante de celle qui gére le canevas qui supporte le dégradé. donc, dans cette dernière méthode, je sauvegarde toute la surface du canevas pour ensuite, lorsque j'affiche le cadre, récupérer le zone qui doit se trouver sous le titre du cadre.
    Il est vrai que si l'on pouvait accéder directement aux pixels de l'écran, se serait plus simple et moins gourmand en mémoire.

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

Discussions similaires

  1. [Swing] Méthode paint qui ne se lance pas
    Par Invité dans le forum Composants
    Réponses: 1
    Dernier message: 29/04/2011, 19h48
  2. [swing] [setComposite] affichage ralenti
    Par marcel72 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/10/2007, 00h32
  3. swing, zorder, paint
    Par rageice dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/07/2007, 20h26
  4. Réponses: 4
    Dernier message: 20/06/2007, 13h15
  5. [Swing][Paint] Logique de dessin
    Par TylerKnoxx dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 07/04/2007, 23h49

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