ok sa marche on peut passer à la prochaine phase comme je te l'ai expliqué. merci et j’attends tes instructions.
Version imprimable
ok sa marche on peut passer à la prochaine phase comme je te l'ai expliqué. merci et j’attends tes instructions.
Le drag 'n drop que tu as programmé semble fonctionner
car une image apparaît à l'endroit où tu largues le composant.
Cette image est dessinée par :
Si l'application s’arrêtait là, on aurait pu s'en contenter.Code:
1
2
3
4
5
6
7
8 public void paintComponent(Graphics g){ super.paintComponent(g); for(Iterator<Composant> it=liste.iterator();it.hasNext();) { Composant ce=(Composant)it.next(); g.drawImage(ce.image,ce.x,ce.y,ce.longueur,ce.largeur,null); } }
Mais voilà : Il faut qu'on puisse déplacer ce composant.
Et là, ça ne marchera pas car c'est très très compliqué de cliquer sur l'image dessinée et la déplacer.
Comment faire simple ?
Au lieu de peindre une image, il faut placer un vrai composant dans la DropZone.
Un petit Jpanel auquel on pourra ajouter des évènements "souris" fera parfaitement l'affaire (on peindra l'image de Composant au fond de ce JPanel).
Tu dois donc créer une nouvelle classe qui étend JPanel pour réaliser l'insertion et le placement dans la DropZone.
Une fois que c'est fait, tu postes le code et on passe au système de déplacement.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package monpackage; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; public class ComposantDeplacable extends JPanel{ public Composant composant; public ComposantDeplacable(Composant c){ composant=c; setPreferredSize(new Dimension(composant.longueur,composant.largeur)); } public void paintComponent(Graphics g){ super.paintComponent(g); g.drawImage(composant.image, composant.x, composant.y,composant.longueur,composant.largeur,null); } }
ComposantDeplacable me semble OK
il faut maintenant modifier la méthode insert de la DropZone pour ajouter ce ComposantDeplacable à la DropZone
voir pour cela :
- Layout null pour la DropZone
- méthode setBounds appliquée à ComposantDeplacable
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package monpackage; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; public class ComposantDeplacable extends JPanel{ public Composant composant; public ComposantDeplacable(Composant c){ composant=c; setPreferredSize(new Dimension(composant.longueur,composant.largeur)); } public void paintComponent(Graphics g){ super.paintComponent(g); g.drawImage(composant.image, composant.x, composant.y,composant.longueur,composant.largeur,null); } }
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 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 DropZone() { setTransferHandler(new DropTransfertHandler()); this.setBackground(Color.white); setLayout(null); liste=new ArrayList<>(); } public void insert(ComposantDeplacable c){ liste.add(c); repaint(); } public void paintComponent(Graphics g){ super.paintComponent(g); for(Iterator<ComposantDeplacable> it=liste.iterator();it.hasNext();) { ComposantDeplacable ce=(ComposantDeplacable)it.next(); ce.setBounds(ce.composant.x, ce.composant.y,ce.composant.longueur,ce.composant.largeur); add(ce); } } }
Ce n'est pas la conclusion à laquelle tu aurais du arriver :
dans la classe DropZone :
1) c'est le travail de la méthode insert de placer le ComposantDeplacable
-> c'est dans cette méthode qu'il faut utiliser le setBounds
2) il est inutile de mettre le ComposantDeplacable dans un ArrayList (la classe JPanel a sa propre liste de composants)
-> tu dois supprimer l'ArrayList
3) ce n'est pas le travail de paintComponent que de placer un composant sur l'écran
-> tu dois donc supprimer purement et simplement la méthode paintComponent
c'est parce que je dois pouvoir sauvegarder les informations sur les composants de la dropZone que je stocke chaque composant dans une arraylist s'il y a un autre moyen comme tu le dis comment l'utiliser?
Ah oui, pour pouvoir recharger un écran qui aura été composé avec la DropZone.
Bon, dans ce cas c'est Ok.
Il y a une autre méthode de JPanel qui est getComponents() qui permet d'obtenir la liste effectives des composants se trouvant sur la DropZone.
- avantage : si un composant est supprimé de la DropZone, la liste est à jour.
- inconvénient : la liste de composants n'est pas typée ; il faut faire un "cast" pour obtenir un ComposantDeplacable
ArrayList :
- avantage : la liste de composants est typée ; on peut manipuler directement les ComposantDeplacable
- inconvénient : il faut mettre à jour l'ArrayList à chaque insertion/suppression de composants
... à ce stade, les deux se valent ; à toi de choisir.
Il faut quand même faire les corrections 1 et 3 expliquées dans mon post précédent.
c'est déjà fait l’attend les instructions pour la suite
Pour déplacer un ComposantDeplacable dans la DropZone, il faut que le ComposantDeplacable réagisse à l'évènement "drag" de la souris.
On ne va pas utiliser le protocole Drag and Drop car un simple MouseMotionListener sera suffisant en utilisant sa méthode mouseDragged.
Quand on va maintenir la souris appuyée sur le ComposantDeplacable la méthode mouseDragged va récupérer les coordonnées de la souris de cette façon :
ici j'ai utilisé un MouseMotionAdapter pour ne pas avoir à redéfinir toutes les autres méthodes du MouseMotionListener.Code:
1
2
3
4
5
6 MouseMotionAdapter mma = new java.awt.event.MouseMotionAdapter() { @Override public void mouseDragged(java.awt.event.MouseEvent evt) { Point p = evt.getPoint(); } }
Ajoute le MouseMotionAdapter au ComposantDeplacable et tâche de voir les coordonnées de déplacement de p avec :
Une fois que tu vois que ces coordonnées s'affichent au fur et à mesure que la souris se déplace,Code:System.out.println(p);
imagine un système qui permet alors que le ComposantDeplacable suive le mouvement
bon là je suis un peux confus car je dessinais mes composants je devais juste changer les coordonnées et utiliser la méthode repaint() et comme je les ajoutes comment modifier leur position dans mon dropZone?
Poste à nouveau les deux classes DropZone et ComposantDeplacable que je vois où tu en est
bon là j'effectue les déplacements mais le coordonnées sont un peux bizarre car lorsque j'effectue le déplacement dans le dropzone des coordonnées négatives apparaissent je ne sais pas pourquoi voilà mes code:
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 package monpackage; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JPanel; public class ComposantDeplacable extends JPanel implements MouseMotionListener{ public Composant composant; public int x,y; public DropZone d; public ComposantDeplacable(Composant c,DropZone dz){ composant=c; d=dz; setPreferredSize(new Dimension(composant.longueur,composant.largeur)); addMouseMotionListener(this); } 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) { Point p=e.getPoint(); d.ModifPosition(this, p); System.out.println(p.x+" "+p.y); } @Override public void mouseMoved(MouseEvent e) { } }
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.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 DropZone() { setTransferHandler(new DropTransfertHandler()); this.setBackground(Color.white); setLayout(null); liste=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); } }
Bon, c'est pas mal.
Maintenant, le problème c'est un phénomène de "tremblotement" au moment du déplacement.
Il est causé par l'application directe des nouvelles coordonnées.
Il faut y aller plus doucement et n'appliquer que la différence entre l'ancienne position de la souris et la nouvelle position.
Pour cela, on enregistre l'ancienne position en conservant l'évènement précédent.
1) on crée une variable MouseEvent chargée de conserver l'ancienne position
2) on calcule la différence de position et on applique que cette différence :Code:
1
2 private java.awt.event.MouseEvent evt_prec = null;
tu verras que le glissement est nettement plus doux.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 @Override public void mouseDragged(MouseEvent e) { // Point p=e.getPoint(); // // d.ModifPosition(this, p); // System.out.println(p.x+" "+p.y); 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); }
bon là c'est beaucoup mieux maintenant nous allons aborder la partie la plus difficile la liaisons entre les composants. ici l'idée c'est de relier les composants entre eux avec des lignes qui seront réactives aux clic de la souris je doit avouer que je n'ai aucune idée sur comment faire j’attends tes instructions.
Nan, nan, il ne faut pas attendre :nono:
Tu dois d'abord essayer par toi-même car il est possible que tu trouves une meilleure solution que moi.
J'ai été très directif pour le drag 'n drop car tu étais mal parti,
mais maintenant que tu es sur un nouveau palier de ton application il faut y aller.
Comme d'habitude, une fois que tu as quelque chose, tu postes le code et on en discute.
ok
bon j'essaie de me connecter a ma bd mysql j'ai télécharger mysql jdbc et lorsque je veux me connecter on m'affiche le message suivant:
voila mon code:Code:
1
2
3com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 String pilote = "com.mysql.jdbc.Driver"; try{ Class.forName(pilote); Connection connexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital","root","pass"); //msg.dialog("OK"); Statement instruction = connexion.createStatement(); }catch(Exception e){ //msg.dialog("!OK \n"+e); System.out.print(e); }
c'est bon le service mysql n’étais pas démarré
Et ta liaison entre composants sur la DropZone ?