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:
Cette méthode fonctionne bien.
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); }
Et surchargé paint de Graphes:
Cette méthode fonctionne. Mais, les arcs partent toujours de la position du point 0,0 du JNode dans 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)); } } }
J'ai donc modifié, pour essayer de bien les placer:
Mais ça donne n'importe quoi:
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)); } } }
Je ne vois pas du tout ce qui cloche.
Si quelqu'un voit le/les soucis, je suis preneur. Merci!
Partager