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
8 public 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