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
Version imprimable
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,
Ne serait-ce point setXORMode(color) ?
Merci camarade, mais la ligne ne s'efface pas...
voici le code testé:
Code:
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:
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: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 8-)
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
Citation:
Envoyé par javadoc
Peut-être ceci :Code: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:
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:
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); } } }
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.