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
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
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); }
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());
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...
Il me semble que cela est plutôt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part g2.setXORMode(getBackground());
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 !
Intéressant. Comment "sauvegarder" une surface (disont rectangulaire) pour la redessiner ensuite ?
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.
Merci à tous. Je vais renifler cette piste
... dans l'excellent bouquin de Romain Guy![]()
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 ?
Utilises une des variantes de la méthode drawImage qui précise quelle partie de l'image dessiner et où la dessiner
Envoyé par javadoc
Peut-être ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part bufferedImage.getSubimage()
Bonjour,
Je crois avoir une autre solution qui permet d'obtenir directement une partie graphique d'un composant.
Voici un exemple (clic sur "capture", puis sur "dessiner capture") :
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);
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); } } }
Merci de penser au tagquand 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
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.
Partager