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?
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?
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
Je suis très chargé en ce moment, je vais essayer de voir cela mercredi
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Responsable Java de Developpez.com (Twitter et Facebook)
Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
--------
Architecte Solution
LinkedIn : https://www.linkedin.com/in/nicolascaudard/
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.
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
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.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
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.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
bon j'ai fias ce que tu a dit mais j'ai pas toujours de résultats souhaités voilà mes codes:
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 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 : 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 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 : 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
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); } } }
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
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?
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
ç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.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part this.setBackground(Color.black);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
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
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
tu peut expliquer d'avantage s'il te plait?les coordonnées sur l'écran (pour un objet Point) sont mesurées
x = position GAUCHE
y = position HAUTE
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
Si tu fais un point situé dans un JPanel
cela veut dire que ce point est situé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Point p = new Point(50,120);
50 pixels à droite du bord gauche du JPanel
120 pixels sous la bordure haute du JPanel
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
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.
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.
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.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
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
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
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?
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
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
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
cela reviens à utiliser 2 connecteurs pour relier 2 composants si je ne me trompe? si oui il faut donc modifier la classe connecteur
La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager