salut j'ai une préoccupation sa fais longtemps que tu ne me répond plus j'aimerais savoir comment tu as fais avec le connecteur?
Version imprimable
salut j'ai une préoccupation sa fais longtemps que tu ne me répond plus j'aimerais savoir comment tu as fais avec le connecteur?
Je suis très chargé en ce moment, je vais essayer de voir cela mercredi
waou mercredi! bref le problème c'est que les délais sont un peux serrés et c'est la dernière partie du projet. entouka si tu peux avoir le temps s'il te plait essaie de regarder sa.
Oui, je sais mais junior222 a continué son post avec une question qui semblait anodine et qui a généré plusieurs pages de questions / réponses
Globalement ça peut intéresser d'autres débutants qui ont des problèmes avec le drag and drop.
Les erreurs et solutions de la discussion sont assez pédagogiques même si par moment on tourne un peu en rond.
Bon alors c'est simple :
pour tracer la ligne entre deux ComposantDeplacable, tu as créé un JPanel Connecteur
mais tu traces la ligne DANS le JPanel Connecteur !
Donc ça n'affiche rien dans la DropZone
C'est dans la DropZone qu'il faut utiliser la méthode paintComponent pour tracer ta ligne.
bon j'ai fias ce que tu a dit mais j'ai pas toujours de résultats souhaités voilà mes codes:
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 package monpackage; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import javax.swing.JPanel; public class Connecteur extends JPanel{ public ComposantDeplacable c1; public ComposantDeplacable c2; public Point p1; public Point p2; public DropZone dz; public Connecteur(DropZone d){ dz=d; this.setBackground(Color.white); } public void InitierConnexion(ComposantDeplacable c){ c1=c; p1.x=c1.getX()+c1.getWidth(); p1.y=(c1.x+c1.getHeight())/2; } public void TerminerConnexion(ComposantDeplacable c){ c2=c; p2.x=c2.x; p2.y=(c2.y+c2.getHeight())/2; dz.ajouterConnexion(this); } }
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 package monpackage; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.datatransfer.DataFlavor; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JPanel; import javax.swing.TransferHandler; public class DropZone extends JPanel{ ArrayList<ComposantDeplacable> liste; public BareEtat b; public boolean etat; //public String idreseau; public ArrayList<Connecteur> listecon; public DropZone() { setTransferHandler(new DropTransfertHandler()); this.setBackground(Color.white); setLayout(null); liste=new ArrayList<>(); //idreseau=nom; listecon=new ArrayList<>(); } public void insert(ComposantDeplacable c){ liste.add(c); add(c); c.setBounds(c.x, c.y,c.composant.longueur,c.composant.largeur); } public void ModifPosition(ComposantDeplacable c,Point p){ c.setBounds(p.x, p.y,c.composant.longueur,c.composant.largeur); } public void ajouterConnexion(Connecteur c){ listecon.add(c); add(c); c.setBounds(c.p1.x,c.p1.y,c.p2.x-c.p1.x,c.p2.y-c.p1.y); c.setPreferredSize(new Dimension(c.p2.x-c.p1.x,c.p2.y-c.p1.y)); repaint(); } public void paintComponent(Graphics g){ super.paintComponent(g); for(Iterator<Connecteur> it=listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); g.drawLine(c.p1.x, c.p1.y, c.p2.x, c.p2.y); } } }
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 package monpackage; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.MenuItem; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; public class ComposantDeplacable extends JPanel implements MouseListener,MouseMotionListener,ActionListener{ public Composant composant; public int x,y; public DropZone d; private JPopupMenu menu; private JMenuItem editer; private JMenuItem supprimer; private JMenuItem connexion; private JMenuItem connexion1; private Connecteur con; public BareEtat be; //public Editer ed; //public String idreseau; private java.awt.event.MouseEvent evt_prec = null; public ComposantDeplacable(Composant c,DropZone dz,BareEtat b){ composant=c; d=dz; setPreferredSize(new Dimension(composant.longueur,composant.largeur)); addMouseListener(this); addMouseMotionListener(this); menu=new JPopupMenu(); editer=new JMenuItem("Editer"); supprimer=new JMenuItem("Supprimer"); connexion=new JMenuItem("Initier Connexion"); connexion1=new JMenuItem("Finaliser Connexion"); menu.add(editer); menu.add(supprimer); menu.add(connexion); menu.add(connexion1); editer.addActionListener(this); supprimer.addActionListener(this); connexion.addActionListener(this); be=b; //ed=new Editer(nom); con=new Connecteur(d); } public void paintComponent(Graphics g){ super.paintComponent(g); g.drawImage(composant.image, composant.x, composant.y,composant.longueur,composant.largeur,null); } @Override public void mouseDragged(MouseEvent e) { if (evt_prec == null) { evt_prec = e; return; } int dX = e.getX() - evt_prec.getX(); int dY = e.getY() - evt_prec.getY(); Point loc = new Point(getLocation().x + dX, getLocation().y + dY); setLocation(loc); d.ModifPosition(this, loc); } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseClicked(MouseEvent arg0) { } @Override public void mouseEntered(MouseEvent e) { be.BareEtatTexte(this.composant.nom); setCursor(new Cursor(Cursor.HAND_CURSOR)); } @Override public void mouseExited(MouseEvent arg0) { be.BareEtatTexte(""); } @Override public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { if(e.isPopupTrigger()){ menu.show(this, e.getX(), e.getY()); } } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Editer")){ //JFrame f=ed.edition(this.composant.nom); //f.setVisible(true); } if(e.getActionCommand().equals("Supprimer")){ this.setVisible(false); d.liste.remove(this); } if(e.getActionCommand().equals("Initier connexion")){ con.InitierConnexion(this); } if(e.getActionCommand().equals("Finaliser connexion")){ con.TerminerConnexion(this); } } }
j'ai encore une préoccupation y a t-il pas un moyen de fixer un connecteur au un ComposantDeplacable de tel sorte que lorsqu'on déplace ce composant son connecteur se déplace également?
ça on verra quand tu auras corrigé les erreurs élémentaires suivantes de la classe ComposantDeplacable :
1) tu as créé connexion1=new JMenuItem("Finaliser Connexion");
mais tu as oublié de l'ajouter avec addActionListener !
2) tu as écris :
if(e.getActionCommand().equals("Finaliser connexion")){
con.TerminerConnexion(this);
}
alors que dans ton JMenuItem il y a "Finaliser Connexion"
donc pour ces raisons, cela ne se déclenche pas.
Tu dois trouver ce genre de petit bugs toi-même en traçant les différentes étapes d'exécution.
(utilise System.out.println("l'étape que je veux tracer"); pour identifier les endroits effectivement utilisés par ton code)
Sinon on perd un temps considérable et ton dossier n'avance pas.
Après correction, tu verras une jolie java.lang.NullPointerException dans la classe Connecteur
il concerne le Point p2. Je te laisse deviner pourquoi ça marche pas.
oui merci beaucoup je vais suivre ton conseille dorénavant je n'avais pas mis ceci dans le constructeur du connecteur:
jusque là le connecteur ne se trace pas comme souhaité lorsque j'ajoute ceci dans le constructeur:Code:
1
2 p1=new Point(); p2=new Point();
lorsque je finalise la connexion un rectangle noir apparait comme prévu mais pas à l'endroit prévu petite modification dans la classe connecteur:Code:this.setBackground(Color.black);
Code:
1
2
3
4
5
6
7
8
9
10
11 public void InitierConnexion(ComposantDeplacable c){ c1=c; p1.x=c1.getX()+c1.getHeight(); p1.y=c1.y+(c1.getWidth()/2); } public void TerminerConnexion(ComposantDeplacable c){ c2=c; p2.x=c2.x; p2.y=c2.y+(c2.getHeight()/2); dz.ajouterConnexion(this); }
getHeight = la hauteur du composant
getwidth = la largeur
les coordonnées sur l'écran (pour un objet Point) sont mesurées
x = position GAUCHE
y = position HAUTE
tu peut expliquer d'avantage s'il te plait?Citation:
les coordonnées sur l'écran (pour un objet Point) sont mesurées
x = position GAUCHE
y = position HAUTE
Si tu fais un point situé dans un JPanel
cela veut dire que ce point est situé :Code:Point p = new Point(50,120);
50 pixels à droite du bord gauche du JPanel
120 pixels sous la bordure haute du JPanel
Solution simple et propre qui a été proposée dans le thread initial.
N'utiliser qu'un unique composant Swing et tout dessiner dessus.
Et surtout se passer des toute la hiérarchie JComponent pour les objets à dessiner.
Si on n'utilise que du dessin, on perd toute possibilité de cliquer sur les composants pour déclencher des évènements pour les déplacements et les lignes de connexion entre les composants.
On peut, bien sûr y arriver avec du dessin. Cependant, cela nécessite de gérer des tableaux d'objets qui vont contenir les datas des composants et de détecter les clics sur leur représentation.
Au bout du compte, on aurait re-créé Swing !
Le problème de junior222 est qu'il est débutant et qu'il a beaucoup de mal à situer les endroits où pêche son code.
C'est pourquoi je l'ai orienté dans une direction où chaque composant a sa responsabilité.
Il est beaucoup plus facile d'y détecter les erreurs de drag and drop par exemple ou bien de voir qu'il n'a pas initialisé un objet Point.
et pour le connecteur je fais comment je crois que les modifications que j'ai faite sont bonne en plus le trait ne se trace pas
Comme je te le disais, commence par vérifier que le paintComponent s'exécute bien avec les bonnes coordonnées
et comme on ne va pas passer Noël là-dessus, tu vas corriger dans DropZone la méthode ajouterConnexion
après cela, tu verras au moins un trait se tracer ... il n'ira pas dans la bonne direction et tu devras trouver comment corriger les coordonnées.Code:
1
2
3
4
5
6
7
8public void ajouterConnexion(Connecteur c) { listecon.add(c); // à supprimer ça ne sert à rien et ça fausse les coordonnées // add(c); // c.setBounds(c.p1.x, c.p1.y, c.p2.x - c.p1.x, c.p2.y - c.p1.y); // c.setPreferredSize(new Dimension(c.p2.x - c.p1.x, c.p2.y - c.p1.y)); repaint(); }
oui apatament le problème n'est pas au niveau des coordonnées parce que je me rend compte que le premier point est toujours le coin supérieur gauche du dropzone et je me dit que ce le premier composant ne s'initialise pas ou perd son initialisation parce qu'on finalise la connexion sur un autre composant je ne sais pas si c'est mieux de mettre un MouseListener,MouseMotionListener sur le dropzone plutôt pour effectuer ces manipulations?
Non, reste sur ton système de coordonnées.
Cette fois, tu as bien identifié le problème.
Il faut simplement que tu places ton connecteur ailleurs que dans le ComposantDeplacable.
une piste : dans ta DropZone, tu as un tableau des connecteurs.
quand tu initialises une connexion, tu places ton nouveau connecteur dans ce tableau.
quand tu finalises ta connexion, tu vas chercher le dernier élément du tableau
cela reviens à utiliser 2 connecteurs pour relier 2 composants si je ne me trompe? si oui il faut donc modifier la classe connecteur
Pas du tout
Il ne faut utiliser qu'un seul connecteur pour relier 2 ComposantDeplacables.
sinon cela va être ingérable.
D'autant plus que ton connecteur est bien pensé : il contient bien le ComposantDeplacable de départ et le ComposantDeplacable d'arrivé. Il ne faut pas changer cela.
dans la pratique :
- retires l'objetde la classe ComposantDeplacableCode:con=new Connecteur(d);
- au moment où tu initialises la connexionalors tu crées ton connecteur et tu l'enregistres dans le tableau listecon de ta DropZoneCode:if(e.getActionCommand().equals("Initier connexion")){
- au moment où tu finalises la connexion alors tu vas chercher le dernier élément du tableau et tu demandes un repaint de la DropZone
comment je fais cela puisque j'utilise une arraylistCitation:
- au moment où tu finalises la connexion alors tu vas chercher le dernier élément du tableau et tu demandes un repaint de la DropZone
Code:
1
2 int indexDeMonDernierConnecteur = listecon.size() -1; Connecteur connecteur = listecon.get(indexDeMonDernierConnecteur);
bon là c'est bon sauf que lorsque j'initialise ma connexion cela part toujours du coin supérieur gauche mais lorsque je finalise sa revient a la normale. dans la dropzone voilà mes modifications:
dans le ccomposantDeplacable:Code:
1
2
3
4
5
6
7
8 public void ajouterConnexion(Connecteur c){ listecon.add(c); } public Connecteur finaliserConnexion(){ int indexDeMonDernierConnecteur = listecon.size() -1; Connecteur connecteur = listecon.get(indexDeMonDernierConnecteur); return connecteur; }
maintenant comment faire pour relier le connecteur au composant pour que lorsqu'on déplace le composant le connecteur se déplace également?Code:
1
2
3
4
5
6
7
8
9
10 if(e.getActionCommand().equals("Initier Connexion")){ con=new Connecteur(d); con.InitierConnexion(this); d.ajouterConnexion(con); } if(e.getActionCommand().equals("Finaliser Connexion")){ con=d.finaliserConnexion(); con.TerminerConnexion(this); d.repaint(); }
C'est ainsi que pratiquent touts les frameworks de graphs, JGraph le premier.
Il utilisent quelques composants swing pour des renderers/editors à la JTable, mais pas plus.
Pour tout ce qui est détection des clics/déplacements/, deux listeners suffisent amplement. D'autant plus si l'on travaille avec l'interface Shape et ses implémentations qui fournissent une méthode contains facile à utiliser.
En effet, la lourdeur des composants Swing est énorme comparé au peu dont on a besoin pour ce genre de choses, ainsi que leur manque de flexibilité, comment relier un connecteur au dessine, gérer les connecteurs qui se croisent et ainsi de suite.
Sans parler des misères liées au setBounds/PreferredSize et ainsi de suite.
Ou alors de pouvoir sélectionner un connecteur/objet se trouvant en dessous d'un autre...
Et des problèmes de perfs liés au nombres de listeners en place.
Pour ce genre de choses, bypasser (façon de parler, on utilise toujours les listeners) swing est amplement profitable.
@sinok tu réponds pour une application de niveau professionnel.
Là il s'agit d'aider un étudiant qui a un mal de chien à s'y retrouver dans le code qu'il écrit pour son devoir.
Donc je tâche de lui donner une réponse qui le fera aller aussi loin que possible.
Il ne s'agit pas de faire un logiciel de CAO pour électricien.
pour l'instant pas besoin de gérer des événements sur les connecteurs car il ne sont là que que pour relier les composants pas plus
Une piste :
Quand l'évènement de déplacement du ComposantDeplacable est déclenché, il faut parcourir la liste des connecteurs listecon (qui se trouve dans DropZone)
Si un connecteur possède le ComposantDeplacable concerné alors il faut faire une mise à jour des coordonnées et déclencher un repaint de DropZone
voilà les modifications apportées au ComposantDeplacable:
le problème c'est que lorsqu'un composant possède plusieurs liens avec d'autres composant, lorsqu'on le déplace seul la dernière connexion est déplacé et les autres ne se déplacent pasCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public void mouseDragged(MouseEvent e) { //..... for(Iterator<Connecteur> it=d.listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); if((c==this.con) && (c.c1==this)){ c.p1.x=this.x+this.getWidth(); c.p1.y=this.y+(this.getHeight()/2); d.repaint(); } if((c==this.con) && (c.c2==this)){ c.p2.x=this.x; c.p2.y=this.y+(this.getHeight()/2); d.repaint(); } } }
j'aimerais également effectuer une petite simulation tu a des pistes?
Pour le deplacements des conecteurs c'est résolu il fallais juste remplacer:
par:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public void mouseDragged(MouseEvent e) { //..... for(Iterator<Connecteur> it=d.listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); if((c==this.con) && (c.c1==this)){ c.p1.x=this.x+this.getWidth(); c.p1.y=this.y+(this.getHeight()/2); d.repaint(); } if((c==this.con) && (c.c2==this)){ c.p2.x=this.x; c.p2.y=this.y+(this.getHeight()/2); d.repaint(); } } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public void mouseDragged(MouseEvent e) { //..... for(Iterator<Connecteur> it=d.listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); if(c.c1==this){ c.p1.x=this.x+this.getWidth(); c.p1.y=this.y+(this.getHeight()/2); d.repaint(); } if(c.c2==this){ c.p2.x=this.x; c.p2.y=this.y+(this.getHeight()/2); d.repaint(); } } }
Bien :ccool:
tu nous diras quelle note tu auras obtenu ? :D
sans problème mais il y a un changement de dernière minute je dois dessiner la carte électrique de mon pays et avec l'optique qu'on a adopté je ne pourrais pas totalement 'en sortir pour les raisons suivantes:
- il faut un autre connecteur qui permettra de tracer des ligne sur la dropzone sans toutefois relier des composants
- il faut ajouter un nouveau composant qui auras pour but d'entourer un nœud du réseau en trait interrompu rouge.
Avec sa je crois j'aurais fini si tu a des pistes je suis tout ouïe
Déjà pour la carte du pays (Cameroun je crois ...) le plus simple est de scanner un fond de carte et d'en faire une image jpeg.
après, on fait tout dans paintComponent :
pour le mettre dans la drop zone, tu utilises la méthode drawImage (attention, il faut exécuter drawImage avant les drawLines sinon l'image va recouvrir les drawLines)
ensuite pour le rouge c'est avec setColor(Color.red)
pour les pointillés, vois du côté de setStroke
pour entourer : drawOval
bon là je crois que tu n'a pas bien compris ma préoccupation je parle d'une carte électrique pas carte comme tu l'entendais donc cette carte contient des générateur des transformateur d'une région reliés entre eux. le but ici est de se servir de cette carte pour redessiner exactement la même carte (réseau) mais dans mon application.
De plus il y a un composant nommé bus qui doit être agrandit ou rétrécie selon la convenance du dessinateur et le nouveau composant qui doit entourer c'est un rectangle qui lui aussi doit être redimensionné selon la convenance du dessinateur. et pour les lignes elles doivent être placé n'importe où dans le graphes elles n'ont pas besoin de relier 2 composants
bon j'ai un peux avancé entre temps j'ai totalement changé de philosophie pour le connecteur. En effet j'ai maintenant une classe connexion et la classe d=connecteur possede une arraylist de connexion. Donc un connecteur est un ensemble de lignes et non une ligne. voilà les modifications:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package monpackage; import java.awt.Point; import javax.swing.JPanel; public class Connexion extends JPanel{ public Point p1; public Point p2; public Connexion(Point p1,Point p2){ this.p1=p1; this.p2=p2; } }
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 package monpackage; import java.awt.Color; import java.awt.Point; import java.util.ArrayList; import javax.swing.JPanel; public class Connecteur extends JPanel{ public ComposantDeplacable c1; public ComposantDeplacable c2; public DropZone dz; public Connexion connexion; public ArrayList<Connexion> con; public boolean etatconnexion; public Connecteur(DropZone d){ dz=d; con=new ArrayList<>(); etatconnexion=false; } public void AjouterConnexion(Connexion c){ con.add(c); dz.repaint(); System.out.println("ajout d'un composant "+c.p1+" "+c.p2); } public void FinaliserConnexion(Connexion c){ con.add(c); etatconnexion=true; dz.repaint(); System.out.println("fin de l'ajout"+c.p1+" "+c.p2); } }
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 package monpackage; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.MenuItem; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; public class ComposantDeplacable extends JPanel implements MouseListener,MouseMotionListener,ActionListener{ public Composant composant; public int x,y; public DropZone d; private JPopupMenu menu; private JMenuItem editer; private JMenuItem supprimer; private JMenuItem connexion; private JMenuItem connexion1; private Connecteur con; public BareEtat be; public Editer ed; public String idreseau; private java.awt.event.MouseEvent evt_prec = null; public ComposantDeplacable(Composant c,DropZone dz,BareEtat b,String nom){ composant=c; d=dz; setPreferredSize(new Dimension(composant.longueur,composant.largeur)); addMouseListener(this); addMouseMotionListener(this); menu=new JPopupMenu(); editer=new JMenuItem("Editer"); supprimer=new JMenuItem("Supprimer"); connexion=new JMenuItem("Initier Connexion"); connexion1=new JMenuItem("Finaliser Connexion"); menu.add(editer); menu.add(supprimer); menu.add(connexion); menu.add(connexion1); editer.addActionListener(this); supprimer.addActionListener(this); connexion.addActionListener(this); connexion1.addActionListener(this); be=b; ed=new Editer(nom); } public void paintComponent(Graphics g){ super.paintComponent(g); g.drawImage(composant.image, composant.x, composant.y,composant.longueur,composant.largeur,null); } @Override public void mouseDragged(MouseEvent e) { if (evt_prec == null) { evt_prec = e; return; } int dX = e.getX() - evt_prec.getX(); int dY = e.getY() - evt_prec.getY(); Point loc = new Point(getLocation().x + dX, getLocation().y + dY); setLocation(loc); this.x=loc.x; this.y=loc.y; d.ModifPosition(this); for(Iterator<Connecteur> it=d.listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); if(c.c1==this){ //c.p1.x=this.x+this.getWidth(); //c.p1.y=this.y+(this.getHeight()/2); d.repaint(); } if(c.c2==this){ //c.p2.x=this.x; //c.p2.y=this.y+(this.getHeight()/2); d.repaint(); } } } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseClicked(MouseEvent arg0) { } @Override public void mouseEntered(MouseEvent e) { be.BareEtatTexte(this.composant.nom); setCursor(new Cursor(Cursor.HAND_CURSOR)); } @Override public void mouseExited(MouseEvent arg0) { be.BareEtatTexte(""); } @Override public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { if(e.isPopupTrigger()){ menu.show(this, e.getX(), e.getY()); } } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Editer")){ JFrame f=ed.edition(this.composant.nom); f.setVisible(true); } if(e.getActionCommand().equals("Supprimer")){ this.setVisible(false); d.liste.remove(this); } if(e.getActionCommand().equals("Initier Connexion")){ con=new Connecteur(d); Point p1=new Point(); p1.x=this.x; p1.y=this.y; Connexion c=new Connexion(p1,p1); con.AjouterConnexion(c); d.ajouterConnexion(con); } if(e.getActionCommand().equals("Finaliser Connexion")){ con=new Connecteur(d); Point p1=new Point(); p1.x=this.x; p1.y=this.y; Connexion c=new Connexion(p1,p1); con.FinaliserConnexion(c); //con=d.finaliserConnexion(); d.repaint(); } } }
mais les traits ne s'affichent pas!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
83
84
85
86
87
88
89
90
91 package monpackage; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.datatransfer.DataFlavor; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JPanel; import javax.swing.TransferHandler; public class DropZone extends JPanel implements MouseListener{ ArrayList<ComposantDeplacable> liste; public BareEtat b; public boolean etat; public String idreseau; public ArrayList<Connecteur> listecon; public Connecteur con; public DropZone(String nom) { setTransferHandler(new DropTransfertHandler()); this.setBackground(Color.white); setLayout(null); liste=new ArrayList<>(); idreseau=nom; listecon=new ArrayList<>(); con= new Connecteur(this); } public void insert(ComposantDeplacable c){ liste.add(c); add(c); c.setBounds(c.x, c.y,c.composant.longueur,c.composant.largeur); } public void ModifPosition(ComposantDeplacable c){ c.setBounds(c.x, c.y,c.composant.longueur,c.composant.largeur); } public void ajouterConnexion(Connecteur c){ listecon.add(c); } public Connecteur finaliserConnexion(){ int indexDeMonDernierConnecteur = listecon.size() -1; Connecteur connecteur = listecon.get(indexDeMonDernierConnecteur); return connecteur; } public void paintComponent(Graphics g){ super.paintComponent(g); for(Iterator<Connecteur> it=listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); //g.drawLine(c.p1.x, c.p1.y, c.p2.x, c.p2.y); for(Iterator<Connexion> it2=c.con.iterator(); it2.hasNext();){ Connexion c1=(Connexion)it2.next(); g.drawLine(c1.p1.x,c1.p1.y,c1.p2.x,c1.p2.y); System.out.println("dessin du connecteur"+c1.p1+" "+c1.p2); } } } @Override public void mouseClicked(MouseEvent e) { int indexDeMonDernierConnecteur = listecon.size() -1; Connecteur connecteur = listecon.get(indexDeMonDernierConnecteur); if(connecteur.etatconnexion==false){ int index=connecteur.con.size()-1; Connexion con=connecteur.con.get(index); Connexion con2=new Connexion(con.p2, e.getPoint()); connecteur.AjouterConnexion(con2); } } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } }
problème de connecteur résolu juste des erreurs d'inattention je veux maintenant juste augmenter l’épaisseur des traits. donc je bloc sur le composants rectangle(drawRect je crois) qui va me permettre d'entourer un nœud du réseau car c'est le dessinateur qui dois décider de sa taille.
bon j'ai fais des progrès pour la zone de sélection mais le problèmes c'est au niveau des cordonnées de fin qui ne sont pas respectés voilà les modifications:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package monpackage; import java.awt.Point; public class Selection { Point p1; Point p2; public Selection(){ p1=new Point(); p2=new Point(); } public void initialise(Point p){ p1=p; } public void finalise(Point p){ p2=p; } }
De plus pour les pointillés j'ai vu qu'on faisais sa avec graphics2D or moi j'utilise graphics comment faire?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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 package monpackage; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.datatransfer.DataFlavor; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JPanel; import javax.swing.TransferHandler; public class DropZone extends JPanel implements MouseListener{ ArrayList<ComposantDeplacable> liste; public BareEtat b; public boolean etat; public String idreseau; public ArrayList<Connecteur> listecon; public Connecteur con; ArrayList<Selection> listSel; public DropZone(String nom) { setTransferHandler(new DropTransfertHandler()); this.setBackground(Color.white); setLayout(null); liste=new ArrayList<>(); idreseau=nom; listecon=new ArrayList<>(); con= new Connecteur(this); listSel=new ArrayList<>(); addMouseListener(this); } public void insert(ComposantDeplacable c){ liste.add(c); add(c); c.setBounds(c.x, c.y,c.composant.longueur,c.composant.largeur); } public void ModifPosition(ComposantDeplacable c){ c.setBounds(c.x, c.y,c.composant.longueur,c.composant.largeur); } public void ajouterConnexion(Connecteur c){ listecon.add(c); } public Connecteur finaliserConnexion(){ int indexDeMonDernierConnecteur = listecon.size() -1; Connecteur connecteur = listecon.get(indexDeMonDernierConnecteur); return connecteur; } public void paintComponent(Graphics g){ super.paintComponent(g); for(Iterator<Connecteur> it=listecon.iterator();it.hasNext();) { Connecteur c=(Connecteur)it.next(); for(Iterator<Connexion> it2=c.con.iterator(); it2.hasNext();){ Connexion c1=(Connexion)it2.next(); g.drawLine(c1.p1.x,c1.p1.y,c1.p2.x,c1.p2.y); } } for(Iterator<Selection> it3=listSel.iterator(); it3.hasNext();){ Selection s=(Selection)it3.next(); g.drawRect(s.p1.x, s.p1.y, s.p2.x, s.p2.y); } } @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2){ int indexDeMonDernierConnecteur = listecon.size() -1; Connecteur connecteur = listecon.get(indexDeMonDernierConnecteur); if(connecteur.etatconnexion==false){ int index=connecteur.con.size()-1; Connexion con=connecteur.con.get(index); Connexion con2=new Connexion(con.p2, e.getPoint()); connecteur.AjouterConnexion(con2); } } } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { Selection se=new Selection(); se.initialise(e.getPoint()); listSel.add(se); } @Override public void mouseReleased(MouseEvent e) { Selection se=listSel.get(listSel.size()-1); se.finalise(e.getPoint()); repaint(); } }
Il te suffit de caster les Graphics fournis en paramètre de paintComponent en Graphics2D.
En effet, les Graphics d'un composant Swing sont systématiquement des Graphics2D.
Code:Graphics2D g2d = (Graphics2D) g;
bon j'ai trouvé pour les style des traits maintenant c'est la zone de sélection qui pose problème car les coordonnées ne sont pas respectés sa s'affiche n'importe comment voilà mes modifications:
dans la dropzone
De plus y aurais t-il pas un moyen de gérer les éventements sur les trait que je dessine?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 public void paintComponent(Graphics g){ //.... float epaisseur=2; float[] style={10,5}; Stroke str2=new BasicStroke(epaisseur,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,10.2f,style,0); for(Iterator<Selection> it3=listSel.iterator(); it3.hasNext();){ Selection s=(Selection)it3.next(); g2.setColor(Color.RED); g2.setStroke(str2); g2.drawRect(s.p1.x, s.p1.y, s.p2.x, s.p2.y); } } //.......... @Override public void mousePressed(MouseEvent e) { Selection se=new Selection(); se.initialise(e.getPoint()); se.finalise(e.getPoint()); listSel.add(se); } @Override public void mouseReleased(MouseEvent e) { Selection se=listSel.get(listSel.size()-1); se.finalise(e.getPoint()); repaint(); } @Override public void mouseDragged(MouseEvent e) { if (evt_prec == null) { evt_prec = e; return; } int dX = e.getX() - evt_prec.getX(); int dY = e.getY() - evt_prec.getY(); Point loc = new Point(getLocation().x + dX, getLocation().y + dY); Selection se=listSel.get(listSel.size()-1); se.finalise(loc); repaint(); }