Bonjour à tous,


Je n'ai pas trouvé de solution à mon problème dans les nombreux sujets des courageux Swing-nautes, donc je le détaille ici, en espérant que vous pourrez m'aider :

J'ai créé une classe Pix qui étend JPanel, et qui est censée (comme n'importe quel composant) se redessiner n'importe quand, par un mouvement de la JFrame ou par un événement souris préalablement créé.

Voici ma classe Pix :

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
package colorCross;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
 
import javax.swing.BorderFactory;
import javax.swing.JPanel;
 
public class Pix extends JPanel {
 
	private static final long serialVersionUID = 1L;
 
	private final PlayableGridModel model;
	private final Point coord;
	private final Color color;
 
	public Pix(Color border, int borderWidth,
			Color helpBorder, int helpBorderWidth,
			int x, int y,
			int width, int height,
			int helpRhythm, PixSizes size,
			PlayableGridModel m, Color c) {
		super(null);
		model = m;
		color = c;
		coord = new Point(x, y);
		setPreferredSize(new Dimension(size.getPixSize(), size.getPixSize()));
		setLayout(new BorderLayout());
		JPanel p = new JPanel(new BorderLayout()); {
			int top = (y != 0 && y % helpRhythm == 0) ? helpBorderWidth : 0,
				left = (x != 0 && x % helpRhythm == 0) ? helpBorderWidth : 0,
				bottom = 0,
				right = 0;
			if (top != 0 || left != 0) {
				p.setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, helpBorder));
			}
			JPanel q = new JPanel(new BorderLayout()); {
				int top0 = (y != 0 && y % helpRhythm == 0) ? 0 : borderWidth,
					left0 = (x != 0 && x % helpRhythm == 0) ? 0 : borderWidth,
					bottom0 = (y == height - 1) ? borderWidth : 0,
					right0 = (x == width - 1) ? borderWidth : 0;
				q.setBorder(BorderFactory.createMatteBorder(top0, left0, bottom0, right0, border));
				q.setPreferredSize(new Dimension(size.getPixSize(), size.getPixSize()));
				q.add(new JPanel());
			}
			p.add(q);
		}
		add(p);
		System.out.println("create " + this.toString());
	}
 
	public JPanel getLastChild() {
		return (JPanel) ((JPanel) ((JPanel) getComponent(0)).getComponent(0)).getComponent(0);
	}
 
	public void paintComponent(Graphics g) {
		System.out.println("paintComponent");
		model.getPixState(coord.x, coord.y).drawPix(getLastChild(), color);
	}
 
}
Et voici, dans une autre classe, la méthode qui gère les changements :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
	private void colorPix(int x, int y) {
		System.out.println("colorpix - begin");
		System.out.println(grid.get(model.getActualColor()).get(x).get(y).toString());
		grid.get(model.getActualColor()).get(x).get(y).repaint();
		System.out.println("colorpix - end");
	}
Avec ça, j'obtiens en console :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
colorpix - begin
colorCross.Pix[,80,80,20x20,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=20,height=20]]
colorpix - end
J'en déduis que la méthode paintComponent de Pix n'est pas appelée...

Par ailleurs, avec cette version de la méthode :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
	private void colorPix(int x, int y) {
		model.getPixState(x, y).drawPix(
				grid.get(model.getActualColor()).get(x).get(y).getLastChild(),
				model.getActualColor()
		);
	}
Le Pix change effectivement d'état (mais au mouvement de la JFrame, il revient à son état initial, puisque son paintComponent n'est pas appelé...


Voilà, j'espère que j'ai été assez clair... Dans l'attente de vos suggestions, et un grand merci d'avance