Bonjour,

J'ai essayé de représenter graphiquement un graphe (constitué de sommets et d'arcs entre ceux-ci).

J'ai donc créé :

- une classe Graphes, constitué de JNode, héritant de JPanel
- une classe JNode, représentant les sommets, héritant de JLabel

J'ai surchargé la méthode paint de JNode:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
@Override
public void paintComponent(Graphics g) {
	super.paintComponent(g);
	Graphics2D comp2D = (Graphics2D)g; 
 
	comp2D.setColor(Color.red); 
	Ellipse2D.Float sign1 = new Ellipse2D.Float(0F, 0F, 50F, 50F); 
	comp2D.fill(sign1);
	comp2D.setColor(Color.BLACK);
	g.drawString(this.getCout()+"", 15, 15);
}
Cette méthode fonctionne bien.

Et surchargé paint de Graphes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
@Override
    public void paint(Graphics g){
	super.paint(g);
	Graphics2D g2 = (Graphics2D)g;
	for(JNode n:noeudsGraphe) {
		Point p1=n.getLocation();
		for(JNode suivant:n.getSuivants()) {
			Point p2=suivant.getLocation();
			g2.draw(new Line2D.Double(p1, p2));
		}
	}
 }
Cette méthode fonctionne. Mais, les arcs partent toujours de la position du point 0,0 du JNode dans Graphes.



J'ai donc modifié, pour essayer de bien les placer:

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
 
@Override
public void paint(Graphics g){
	super.paint(g);
	Graphics2D g2 = (Graphics2D)g;
	for(JNode n:noeudsGraphe) {
		Point p1=n.getLocation();
		double x1=p1.getX()+10;
		double y1=p1.getY()+10;
		double largeur1=n.getWidth();
		double hauteur1=n.getHeight();
 
		for(JNode suivant:n.getSuivants()) {
			Point p2=suivant.getLocation();
			double x2=p2.getX();
			double y2=p2.getY();
			double largeur2=suivant.getWidth();
			double hauteur2=suivant.getHeight();
 
			if(x1<x2 && y1<y2) { //si diag inf GD
				p1.setLocation(x1+largeur1, y1+hauteur1);
			} else if(x1>x2 && y1>y2) { //si diag sup DG
				p2.setLocation(x2+largeur2, y2+hauteur2);
			} else if(x1>x2 && y1<y2) { //si diag inf DG
				p1.setLocation(x1, y1+hauteur1);
				p2.setLocation(x1+largeur1, y1);
			} else if(x1<x2 && y1>y2) { //si diag sup GD
				p1.setLocation(x1+largeur1, y1);
				p2.setLocation(x2, y2+hauteur2);
			} else if(x1==x2) { //même colonne
				if(y1<y2) {//vers le bas
					p1.setLocation(x1+(largeur1/2), y1+hauteur1);
					p2.setLocation(x2+(largeur2/2), y2);
				} else {//vers le haut
					p1.setLocation(x1+(largeur1/2), y1+hauteur1);
					p2.setLocation(x2+(largeur2/2), y2);
				} 
			} else if(y1==y2) { //même ligne
				if(x1 < x2){ //vers la droite
					p1.setLocation(x1+largeur1, y1+(hauteur1/2));
					p2.setLocation(x2, y2+(hauteur2/2));
				} else { //vers la gauche
					p1.setLocation(x1, y1+(hauteur1/2));
					p2.setLocation(x2+largeur2, y2+(hauteur2/2));
				} 
			}
			g2.draw(new Line2D.Double(p1, p2));
		}
	}
}
Mais ça donne n'importe quoi:



Je ne vois pas du tout ce qui cloche.

Si quelqu'un voit le/les soucis, je suis preneur. Merci!