# Java > Interfaces Graphiques en Java > AWT/Swing >  Affichage d'un JPane dans un JFrame

## junior222

Bonjour,

Je dveloppe une application qui va permettre de dessiner des rseaux lectriques.

Lorsque je cre mon panneau de composants et que je l'ajoute  ma fentre, il ne s'affiche pas et je ne sais pas pourquoi.

Voici mon code 


```

```

De plus, j'ai constat que lorsque j'ajoute le panneau de composant au  centre, il s'ajoute bien mais lorsque je l'ajoute  gauche rien.
Voici son code:

```

```

Quelqu'un saurait-il m'indiquer d'o peut venir le problme ?

Merci d'avance pour votre aide.

----------


## supergeoffrey

Bonjour,


> De plus j'ai constat que lorsque j'ajoute le panneau de composant au centre il s'ajoute bien mais lorsque je l'ajoute  gauche rien.


Dans un border layout tu dois toujours mettre un composant au centre!

----------


## junior222

et si je veux que mes composants s'affiche sur la mme fentre comment je fais?

----------


## Npomucne

Tu choisis un autre layout genre flowLayout
(le Layout c'est comme le restaurant. s'il n'est pas  ton gout, il faut en changer)
Enfin, si tu dois avoir une prsentation particulire avec les composants placs de faon prcise
tu peux toujours utiliser AbsoluteLayout
ou alors si tu dveloppes avec NetBeans, tu places tes composants facilement directement sur le JFrame

----------


## junior222

la j'ai utilis un flow layout et jusquel rien ne s'affiche voila les modifications ajouts:


```

```

mais le problme c'est qu'un flow layout ne peut pas rsoudre mon problme car dans ma fentre je doit avoir en haut une boite  outils, a gauche un panneau de composant, au milieu un panneau de dessin et en bas une barre dtat comment je fais alors?

----------


## Npomucne

Bon alors il y a un "trukimarche" c'est d'utiliser un Layout null et de positionner les JPanel  la main
Le problme c'est qu'avec cette solution, tu ne peux pas redimensionner ta fentre car les JPanels ne suivront pas.


```

```

Bon mais franchement, la vraie solution c'est de tlcharger NetBeans 7.2 qui te permets de placer tes composants de faon visuelle sur l'cran avec redimensionnement automatique, calage de zones, etc c'est un vrai bonheur  ::ccool::

----------


## Npomucne

Pris d'un remord, je t'ai fait un exemple "BorderLayout " avec des panneaux que tu peux placer  peut prs comme tu as dis.
L'ide c'est que tu peux jouer sur setPreferredSize pour augmenter ou diminuer la taille des panneaux :


```

```

----------


## junior222

je comprend tout a fait ta solution mais le problme c'est que j'utilise mes propres panels que j'ai cr et c'est sa qui cause le problme car il ne s'affiche pas ensemble

----------


## Npomucne

Ton programme est trop compliqu. Par exemple tu refais un panneau au centre pour y placer tes panneaux "mtier".
Cela ne sert  rien - tu peux placer tes panneaux directement sur le JFrame. Il faut simplifier

Je t'ai post un exemple simple pour te montrer comment placer 4 Jpanels
dans un BorderLayout (qui est le Layout par dfaut du JFrame)

Par exemple pour placer un panneau  gauche :


```
getContentPane().add(jPanel4, java.awt.BorderLayout.WEST);
```

tu peux placer
gauche = WEST
droite = EAST
au dessus = NORTH
en dessous = SOUTH
centre = CENTER

il est trs important de prciser la taille des panneaux de bordure


```
jPanel3.setPreferredSize(new java.awt.Dimension(500, 50));
```

Avec les couleurs tu vois bien o ils se placent.

Une fois que tu as bien compris la mcanique, tu remplaces par les panneaux que tu as dfini.

----------


## fraco

> il est trs important de prciser la taille des panneaux de bordure


? sinon leur taille sera fixe dynamiquement en fonction de leur contenu...
juste ?

dans certains cas c'est mieux, je crois.

----------


## junior222

merci beaucoup pour vos aides elles m'ont t trs prcieuse la j'ai a nouveau un problme je veux porter un composant du panneau de composant pour le dposer sur le paneau de dessin mais aparament le code que j'ai implment ne marche pas car lorsque je porte le composant du panneau de composant il ne sort pas de ce panneau et je ne sait pas pourquoi voil les codes:


```

```



```

```

Quelquun saurais comment faire?

----------


## Npomucne

Bon ben il y a du travail  prvoir.

Quand tu transfres en faisant du drag and drop, il faut non seulement 
dplacer une image de composant mais aussi des donnes.

Par ailleurs, java prvoit de pouvoir faire des glisser-dplacer d'une application externe vers une application java et vice-versa

Donc l'ensemble est un peu compliqu (eh oui) et tu dois prvoir une bonne journe pour tudier la chose
dans un premier temps le tuto officiel  examiner attentivement : http://docs.oracle.com/javase/tutori...dnd/intro.html
(attention, leur exemple de glisser dplacer de la couleur ne fonctionne pas)

Si tu n'y arrives pas alors poste un nouveau message et on verra o tu en est.

----------


## Npomucne

> ? sinon leur taille sera fixe dynamiquement en fonction de leur contenu...
> juste ?
> 
> dans certains cas c'est mieux, je crois.


Si tu fais un panneau contenant 5 lments (des JLabel par exemple),
le FlowLayout va les placer par dfaut l'un  cot de l'autre.
pour le panneau du haut a peut aller
par contre, pour le panneau de gauche c'est rat : il aura vite envahi tout l'cran au lieu de les placer les uns au dessus des autres !

----------


## junior222

est ce qu'il n'y a  pas un tuto en franais? je dois avouer que je ne m'en sort pas trs bien en anglais

----------


## Npomucne

2 tutos :
Le drag and drop pour tous (avec des sources)

Mickael BARON

 noter que si tu fais rgulirement de la programmation java pour poste de travail, la maitrise du drag and drop est un investissement rentable.

----------


## fraco

> le FlowLayout va les placer par dfaut l'un  cot de l'autre.


BoxLayout ?

----------


## Npomucne

BoxLayout ?
bien sr avec l'orientation Y_AXIS

Mais toute la discussion portait sur du code avec FlowLayout donc je suis rest dessus.

Ce qui m'ennuie surtout c'est que finalement, junior222 a choisi un Layout null
qui n'est pas vraiment la meilleure ide que j'ai eu.  ::?: 

Bon maintenant, on est pass au problme de drag and drop. L, je crois qu'on a de quoi faire !

----------


## junior222

Je n'ai pas utilis de layout null mais j'ai utilis un border layout et les mthodes setpreferedsize pour tout les composants ce qui marche bien. et pour le drag and drop je vais tudier et vous rendre compte.

----------


## junior222

Bon l je viens de terminer avec le tutoriel et j'ai quelques incomprhensions notamment parce que je veux faire du drag and drop d'image.

J'ai implment les classes suivantes:


```

```



```

```



```

```



```

```



```

```

Et j'ai eu des difficults  implmenter la classe TransfertHandler. Voil ce que j'ai fait mais le travail n'est pas termin

```

```

----------


## junior222

De plus j'aimerais savoir comment recuperer l'objet sur lequel pointe la souris dans un conteneur?

----------


## Npomucne

Bonjour Junior222

J'ai charg dans toutes tes classes dans NetBeans.
Bon, il y a de l'ide mais a patauge dur. C'est normal car c'est difficile au dbut.  :;): 

un dtail  rgler tout de suite : private DataFlavor img = new DataFlavor("image/pnng", null);
il y a un "n" en trop.

A faire : 

1.1) le listener de souris DragAndDropListener doit tre plac sur le composant ComposantTransferable et non pas sur PanneauComposant
en effet, le panneau ne sert que de support (d'ailleurs, il peut comporter des JButton qui ne doivent pas bouger eux)

1.2) dans le mme ordre d'ide, setTransferHandler(new ComposantTransfertHandler()) doit tre plac dans le constructeur de ComposantTransferable (il ne concerne pas le PanneauComposant)

1.3) abandonne tout de suite le paintComponent du PanneauComposant :
il faut ajouter les ComposantTransferable sur le panneau (mthode add) et non pas les dessiner.
En effet, une fois dessin tes composants ne sont plus que des dessins et non pas des objets qu'on "draguer" 
(quel jeux de mots j'ai honte)

Pour la suite :
2.1) Tu cres un panneau qui servira  "dropper" ton composant ComposantTransferable. 
Appelons ce panneau DropZone
Au dbut, ce panneau n'a strictement rien de particulier (aucun code spcifique).

2.2) Tu cres un nouveau TransfertHandler qui sera charg de grer le drop de ComposantTransferable sur DropZone.
Appelons cette classe DropTransfertHandler.
Les mthodes  surcharger sont :
- public boolean canImport : indiquera, lors du survol de la souris qu'on est bien  un endroit o on peut poser un ComposantTransferable
- public boolean importData : se dclenche lors du drop. C'est ce qui te permets de rcuprer les donnes transfres

2.3) Tu ajoutes setTransferHandler(new DropTransfertHandler()) au constructeur de DropZone.
Tu n'as aucun vnement souris  crer.

Poste ton code quand tu auras avanc.

----------


## junior222

merci pour toutes ces prcisions mais il se pose un problme
1.1) pour ajouter le listener de souris au ComposantTransferable il faut qu'il herite de JComponent. et idem pour la mthode setTransfertHandler. De plus je ne comprend pas comment mes composants vont s'ajouter au panneauComposant si j'utilise la mthode add.

----------


## Npomucne

C'est l o je voulais en venir. Avec le choix de Canvas c'est trs difficile de faire du DnD.
Plutt que d'utiliser Canvas qui vient d'AWT, il vaut mieux tout faire en SWING.

Pour faire ta classe ComposantTransferable, tu dois tendre un JPanel et tu implmentes Transferable
comme a tu peux y placer ton image (en surchargeant paintComponent)
et tu as toutes les mthodes de Transferable
(la classe Composant ne sert plus)

Aprs, tu peux utiliser la mthode add pour ajouter Composant au JPanel qui sert  prsenter les ComposantTransferable

----------


## junior222

bon j'ai fini les modifications que tu m'a demand de faire voila mes codes:


```

```



```

```



```

```



```

```



```

```



```

```



```

```



```

```

----------


## Npomucne

C'est pas mal, on avance bien.

Tout d'abord, une bonne cure d'amaigrissement pour le ComposantTransfertHandler
seul le code suivant est ncessaire :


```

```


pour la DropZone, je prconise un JPanel plutt qu'un JComponent

Pour le DropTransfertHandler il manque le systme de rcupration du composant transfr.
Le principe que j'utilise est de rcuprer les donnes et de les copier dans un nouveau composant
Pour cela :
- il faudra implmenter clonable dans la classe Composant (qui finalement va nous servir)
- il faut que Composant tende JPanel ou JLabel (pour pouvoir tre ajout  DropZone)
- il faut rendre accessible le champ composant contenu dans ComposantTransferable (en le rendant public ou bien en crant une mthode getComposant dans la classe ComposantTransferable )
- il faut crer une mthode "insert" dans la classe DropZone. Cette mthode doit tre capable de placer un objet Composant  un point prcis.

ceci fait, il faut ajouter la cration d'un composant rcupr dans la mthode importData :


```

```

Bon, j'ai survol certains points (la mthode insert par exemple). 
Aprs avoir fait tes essais, tu me diras ce qu'on doit approfondir.

----------


## junior222

bon la j'ai fait des petites modifications comme tu m'as dit mais apparemment la mthode clone la classe cloneable n'est pas public donc j'ai fais des ajustements et pour la classe DropZone j'aimerais qu'on puisse dplacer les composants. Ceci dit on doit tre capable a la fin de porter un composant du panneau composant, le dposer sur le dropZone (ventuellement le dplacer sur le dropzone) et par exemple cliquer sur lui pour l'diter. voila mes modifications:


```

```



```

```



```

```

 et pour les autres classes c'est sans changement a savoir: composantflavor, draganddroplistener et panneacomposant.

----------


## junior222

bon j'ai essayer de tester tout ceci mais le composant ne s'affiche pas dans le panneaucomposant comme je le presentais voila le code:


```

```

----------


## Npomucne

Je n'ai pas t clair dans  la mthode importData (qui est propre  la classe TransfertHandler)
la modification doit tre apporte dans la classe DropTransfertHandler 
mais ne doit pas tre cre dans la classe DropZone

----------


## junior222

ok voila les modifications apportes:


```

```



```

```

----------


## Npomucne

Maintenant voyons la mthode insert de la classe DropZone.
Elle doit permettre de placer un composant (un JPanel)  un endroit prcis (le point p)

2 possibilits :

1) Utiliser un NullLayout pour DropZone. Avec ce Layout ou plutt cette absence de Layout, il est possible de spcifier au pixel prs l'endroit o doit se trouver le composant et sa dimension.
DropZone devient :



```

```

Bien entendu il faudra mettre largeur et hauteur dans la classe Composant (en tout cas autre part qu'en dur dans la mthode insert !)

2) Si tu dveloppes avec NetBeans, tu peux utiliser AbsoluteLayout pour la classe DropZone
cela donne :


```

```

Bon voil. Avant d'aller plus loin, tu dois tester l'ensemble et bien vrifier que le drag and drop fonctionne.
Ds que a marche, on reparle de la classe Composant dans DropZone.

----------


## junior222

Le problme c'est que le composant ne s'affiche pas dans le panneaucomposant donc pas moyen de tester le drag and drop voila mme les modifications que j'ai apport:


```

```



```

```



```

```

En passant j'utilise eclipse

----------


## Npomucne

Je viens de regarder la dernire version de ta classe PanneauComposant 
au moment de la construction, ton ArrayList listecomp est vide.
Donc aucune chance qu'il affiche quoi que ce soit

Aprs quand tu ajoutes des composants par la mthode ajouterComposant,
a ajoute le composant  ton ArrayList listecomp mais rien n'est prvu pour afficher listecomp.

proposition de rectification :



```

```

----------


## junior222

jusque la rien toujours comment le composant doit s'afficher avec l'image que j'ai dfinit voila mon code:


```

```

----------


## Npomucne

Nan nan, on est tous les deux  ct de la plaque depuis deux heures !
dans le panneauComposant il faut mettre des objets *ComposantTransferable* et non pas Composant (sinon tout a ne sert  rien)

----------


## junior222

ok voila le code du panneaucomposant:


```

```



```

```

mais rien ne s'affiche toujours dans le panneaucomposant

----------


## Npomucne

Plusieurs erreurs dans ComposantTransferable :
1) il n'a pas de PreferredSize 
ajoute dans son constructeur : setPreferredSize(new Dimension(100, 100));
2) la mthode enableDrag  n'est pas appele donc ton listener n'est pas ajout
ajoute dans le constructeur : addMouseListener(new DragAndDropListener());
3) le drawImage ne dessine pas il faut crire :
        g.drawImage(composant.image, composant.x, composant.y, 100,100, null);

c'est comme pour l'ajout dans l'ArrayList de tout  l'heure
tu fais du code ... qui n'est pas appel !


4) le DragAndDropListener ne doit pas porter sur le PanneauComposant mais sur le ComposantTransferable

Il y a encore d'autres problmes sur lesquels je travaille

----------


## junior222

bon j'ai comme tu m'a dit et le composanttransferable s'affiche dans le panneaucomposant comme un panel et sans l'image que j'ai defintis, de plus le drag and drop ne marche pas. voila les modifications:


```

```



```

```

----------


## Npomucne

> de plus le drag and drop ne marche pas


Oui j'ai vu. Pour le moment je n'ai pas encore trouv l'erreur. Je suppose qu'il s'agit d'un DataFlavor qui ne doit pas tre bien paramtr quelque part.
Cherche aussi de ton ct parce qu'aujourd'hui je n'aurais pas le temps.

----------


## junior222

bon j'ai essay de parcourir certains tuto et j'ai remarqu qu'en gnral c'est le panneauComposant a qui on ajoute le listener et le transferthandler

----------


## Npomucne

> en gnral c'est le panneauComposant a qui on ajoute le listener et le transferthandler


Non, c'est le ComposantTransferable qu'on transfre, pas le panneau sur lequel il est assis !

J'ai fini par trouver par comparaison avec mon propre code (on fait  peu prs la mme application)
L je dois dire que l'erreur tenait dans un dtail que je n'hsite pas  qualifier de diabolique !
Elle se situe dans le ComposantTransfertHandler qui tend la classe TransferHandler et dont on doit redfinir les mthodes
- getSourceActions
- createTransferable
Seulement voil, au lieu de taper : 


```
     public int getSourceActions(JComponent c) { ...
```

tu as tap :


```
     public int getSourceAction(JComponent c) {
```

--> il manque le "s"  la fin de "getSourceAction"
Rsultat : il y avait une mthode getSourceAction dans ton TransHandler qui ne servait  rien car jamais appele
le systme de "Drag" utilisait en fait la mthode de la classe mre (qui existait toujours) et qui ne faisait donc rien
car on ne l'avait pas redfinie (par dfaut elle ne fait rien !)

Tout a pour dire qu'il faut ajouter un "s"  getSourceAction

et a marche !

----------


## junior222

bon chez moi le composant qu j'ajoute ne s'affiche pas dans le panneaucomposant en plus pour grer le dplacement des composants dans le dragzone je dois dfinir un transferthandler? et est ce que je dois l'ajouter au composanttransferable? comment grer les vnements sur le composant transferable? c'est dans le draganddroplistener? et pour relier les composants dans le dragzone comment faire? un fois de plus merci pour ton aide si prcieuse

----------


## Npomucne

Rgle d'abord le problme de l'affichage dans le panneau de gauche.
Cela doit permettre de vrifier que le drag dmarre.

Une remarque gnrale : tu fais du code inutilement compliqu. Il n'est pas ncessaire, par exemple, de faire une classe spciale pour le mouseListener
ou encore je ne vois pas l'intrt de la mthode getJContentPane dans Acceuil.
Mais c'est mon opinion ...

Pour l'instant ne change rien on continue avec ce que tu as fait.

----------


## junior222

bon la le composant s'affiche c'tait juste des erreurs dinattention. le drag marche bien mais le dropzone  n'accepte pas le drop.

----------


## Npomucne

C'est normal, il faut crer un TransferHandler spcifique pour la DropZone

----------


## junior222

oui c'est aussi ce que j'ai pens mais je crois que c'est le rle de la classe DropTransfertHandler que voila:


```

```

----------


## Npomucne

Je regarde a

----------


## junior222

le problme est au niveau du dataflavor j'ai mis le contenu de la methode canImport du droptransferthandler le panneau accepte le drop mais le composant ne s'affiche pas dans le dropzone

----------


## Npomucne

*1) rectifications*

Tu dois faire attention quand tu surcharges une mthode.
Tu as fais la mme erreur que prcdemment  savoir une petite faute de syntaxe qui fait croire que tu as bien surcharg la mthode mais qui cre une autre mthode :
tu as tap :


```
public boolean canimport(TransferHandler.TransferSupport info) {
```

alors qu'il fallait taper :


```
public boolean canImport(TransferHandler.TransferSupport info) {
```

il fallait un "i" majuscule. N'oublie pas que java est sensible  la casse.
Moralit : il faut faire du copier/coller de code pour viter ce problme
ou alors bien vrifier !

toujours dans la mme mthode, tu lui mets comme condition :


```

```

a veut dire que s'il ne s'agit pas d'une image alors il ne doit pas transfrer.
Or nous voulons transfrer un objet "ComposantTransferable" qui n'est pas une image !

concentre-toi bien quand tu codes et demande-toi toujours pourquoi tu cris ce que tu cris.

Bon enfin dans la mthode "importData" tu essayes de rcuprer le ComposantTransferable :


```
ComposantTransferable comp = (ComposantTransferable) support.getTransferable();
```

erreur, il faut crire :


```
ComposantTransferable comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
```

mais il est vrai que ce dernier point n'est pas intuitif !

Voil. Maintenant le drop en lui-mme va fonctionner

Ce qui ne marche pas c'est la mthode clone (elle plante) car elle renvoie l'objet lui-mme au lieu d'une copie de l'objet (voir documentation de clone)


*2) volutions*

On aborde ici un nouveau point de ton application.
En fait, je trouve que le clone n'est pas si intressant :  quoi bon copier l'objet transfr ComposantTransferable pour l'insrer dans DropZone ?
Plutt que de chercher  faire un clone, rcupre l'image et le texte et construit un tout nouvel objet sur lequel tu pourras programmer les connexions lectriques avec les autres lments (c'est le but de ton application).

----------


## junior222

voila ma nouvelle classe dropTransfertHandler mais elle n'accepte toujours pas le drop:


```

```

----------


## Npomucne

Ben dj il faudrait apporter toutes les corrections mentionnes plus haut

----------


## junior222

je ne sais pas pourquoi mais canimport est cris avec i majuscule et sa s'affiche en minuscule

----------


## junior222

j'ai comme l'impression que la mthode insert n'agit pas voila son code:


```

```

----------


## junior222

peut etre le probleme est ailleurs je poste toutes mes classes ll tu procede par identification comme l'autre jour:


```

```



```

```



```

```



```

```



```

```



```

```



```

```



```

```

En passant dans la classe droptransferthandler la methode canImport est avec i majuscule

----------


## Npomucne

1) Dans le code que tu as post, il est avec un "i" minuscule et donc ne peut pas fonctionner.
2) Toujours dans canImport, tu utilises DataFlavor.imageFlavor et non pas ComposantFlavor.getComposantFlavor() donc a ne pourra pas marcher
3) La mthode clone dans la classe Composant ne peut pas fonctionner : tu renvoies l'objet lui-mme ET PAS une copie (voir doc de clone) comme il faut le faire. Donc a va planter

Ces modifications devaient tre faites.
Tant que tu ne fais pas les modifications, on ne peut pas continuer.

----------


## junior222

bon la j'ai essayer de modifier le classe dropzone et droptransferthandler pour qu'ils puissent afficher le composant qui est drop. voila les codes:


```

```



```

```

et j'ai ajout ceci dans Composant


```
setPreferredSize(new Dimension(longueur,largeur));
```

dans le constructeur mais le composant ne s'affiche pas dans le dropzone aprs le drop

----------


## junior222

une fois de plus je ne sais pas pourquoi le i de canimport est en minuscule pourtant il est en majuscule dans mon code. De plus lorsque je fais ceci:


```

```

le composant j'ajoute bien donc je pense que le problme se situe au niveau du importData du droptransferthandler. remarque: le dropzone accepte bien le drop c'est le transfert qui pose problme.

----------


## Npomucne

J'ai du mal  comprendre. 
Tu dis que dans ton IDE le "i" est en majuscule et que lorsque tu le postes sur developpez.net il passe en minuscule ?

Ajoute le code en rouge  ton DropTransfertHandler de la faon suivante :

*1) test de dclenchement :*


```

```

*2) vrification de la compilation :*


```

```

Si a plante  la compilation c'est que canImport n'est pas bien crit
Si ce point n'est pas rgl, le importData ne se dclenche pas

*
j'ai besoin de savoir* :
- quel est ton IDE (NetBeans, Eclipse, ...) ?
- quelle version de Java utilises-tu ?

.

----------


## junior222

j'ai fait comme tu m'a dit et lorsque jexcute et que je fait mon drag et que je suis sur le dropzone, le message crit dans canImportData est affich et lorsque je fais le drop le message qui est dans le importData s'affiche et sa ne plante pas en effet je pense que les 2 mthodes sont utilises et que le problme rside dans la rcupration du composant qui st drag. De plus j'utilise eclipse et jdk dans sa version 1.7

----------


## Npomucne

Alors c'est bon, on peut y aller :

* La guerre des clones*

tu ne peux pas rcuprer ton composant car tu utilises une mthode clone qui ne marche pas  ::nono:: 
(je te l'avais dj dis )

tu as cris dans ta classe Composant :


```

```

ceci ne cre EN AUCUN CAS une copie mais renvoie l'objet lui-mme (avec une boucle infinie par dessus le march)

Remplace-moi cette horreur par :


```

```

----------


## junior222

j'ai fais comme tu as dit et le problme se situe au niveau du drop car je n'arrive pas a recuperer le composant qui est port voila donc le nouveau code:


```

```



```

```

de plus le 

```
            System.out.print("vous avez collé "+copie.nom);
```

 ne s'affiche pas lors du drop

----------


## Npomucne

Bon je ne connais pas Eclipse (j'utilise NetBeans)
mais je pense qu'il doit avoir une option de run avec debug.
Essaye de l'excuter ligne  ligne pour voir o il s'arrte.

Sinon, place des System.out.println("instruction excute") aprs chaque instruction (mthode de bourin mais bon ...)

----------


## junior222

bon moi je pense que le problme se trouve au niveau de la ligne:


```
comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
```

 est ce qu'elle retourne vraiment le composant transfr?

----------


## Npomucne

Es-tu sr que la ligne est excute ?
modifie ton code :


```

```

----------


## junior222

de plus voila l'erreur du debug:


```

```

rien ne s'affiche aprs l'ajout de


```
System.out.print("récupéré "+comp.getClass().getName());
```

lors du drop

----------


## junior222

je crois que j'ai trouv le problme la variable comp est null donc l'instruction

```
comp = (ComposantTransferable) support.getTransferable().getTransferData(ComposantFlavor.getComposantFlavor());
```

 n'est pas excut

----------


## Npomucne

Non. La variable est simplement initialise  null ; ensuite l'instruction est excute.
De mon ct, j'ai la mme instruction qui fonctionne parfaitement.
ajoute @Override avant les deux mthodes comme j'ai expliqu dans le post du *26/09/2012 09h58*
ensuite fait une compilation du code

je ne comprends toujours pas pourquoi 


```
public boolean canimport(TransferHandler.TransferSupport info) { ...
```

est crit avec un "i" minuscule.

aprs compilation et ajout du @Override, poste le nouveau code que je puisse le tester de mon ct.

----------


## junior222

```

```

----------


## Npomucne

et a compile avec le "i" du "canimport" en minuscule ?

----------


## junior222

oui puisque dans mon environnement c'est en majuscule

----------


## Npomucne

Bon, peux-tu re-poster toutes tes classes exactement comme elles sont.
Je vais les importer dans NetBeans et voir le message d'erreur (ce soir).

----------


## junior222

```

```



```

```



```

```



```

```



```

```



```

```



```

```



```

```



```

```

----------


## Npomucne

Je n'ai pas trouv comment tu fais pour dmarrer l'application.
Il faut que dans une de tes classes il y ait :


```

```

----------


## junior222

c'est la classe acceuil qui lance l'application donc c'est elle qui contient le:


```

```

----------


## Npomucne

Ah bon ? j'ai beau regarder dans le code de la classe, je ne vois pas la mthode main

----------


## junior222

dsol rectification:


```

```

----------


## Npomucne

Ce n'est pas le code que tu utilises car ton JFrame Acceuil ne s'affiche pas :


```

```

----------


## junior222

si chez moi j'ai mme eu besoin de mettre la mthode main

----------


## junior222

remplace donc 

```
 new Acceuil();
```

 par 

```
new Acceuil().setVisible(true);
```

----------


## junior222

En passant puisque pour l'instant je peux ajouter les composants manuellement tu peux me donner les indications pour la suit?
a savoir:
- comment dplacer un composant sur le dropzone
- comment relier les composants 
- comment grer les vnements sur les composants (clic, slection,...)
comme sa on avance un peux car depuis un bout on bloc et j'aimerais un peux avancer s'il te plait on trouvera la solution en chemin je pense.

----------


## Npomucne

Voil la classe DropTransfertHandler qui correspond aux autres classes de ton application.
Je n'avais pas la mme version que toi des autres classes (que j'avais un peu remanies  ma sauce)
C'est pourquoi je t'ai demand de poster toutes les classes.

La confusion venait de l'utilisation de ComposantTransferable au lieu de Composant

Les lignes  corriger sont en rouge, les corrections sont en vert.


```

```

par ailleurs, ajoute dans la classe Acceuil :
*setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*
dans le constructeur

----------


## junior222

ok sa marche on peut passer  la prochaine phase comme je te l'ai expliqu. merci et jattends tes instructions.

----------


## Npomucne

Le drag 'n drop que tu as programm semble fonctionner 
car une image apparat  l'endroit o tu largues le composant.
Cette image est dessine par :


```

```

Si l'application sarrtait l, on aurait pu s'en contenter.

Mais voil : Il faut qu'on puisse dplacer ce composant.
Et l, a ne marchera pas car c'est trs trs compliqu de cliquer sur l'image dessine et la dplacer.

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 vnements "souris" fera parfaitement l'affaire (on peindra l'image de Composant au fond de ce JPanel).
Tu dois donc crer une nouvelle classe qui tend JPanel pour raliser l'insertion et le placement dans la DropZone.
Une fois que c'est fait, tu postes le code et on passe au systme de dplacement.

----------


## junior222

```

```

----------


## Npomucne

ComposantDeplacable me semble OK
il faut maintenant modifier la mthode insert de la DropZone pour ajouter ce ComposantDeplacable  la DropZone 
voir pour cela :
- Layout null pour la DropZone 
- mthode setBounds applique  ComposantDeplacable

----------


## junior222

```

```



```

```

----------


## Npomucne

Ce n'est pas la conclusion  laquelle tu aurais du arriver :

*dans la classe DropZone :* 

1) c'est le travail de la mthode *insert* de placer le ComposantDeplacable 
-> c'est dans cette mthode 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 mthode paintComponent

----------


## junior222

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?

----------


## Npomucne

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 mthode 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.
- inconvnient : la liste de composants n'est pas type ; il faut faire un "cast" pour obtenir un ComposantDeplacable 

ArrayList :
- avantage : la liste de composants est type ; on peut manipuler directement les ComposantDeplacable 
- inconvnient : il faut mettre  jour l'ArrayList  chaque insertion/suppression de composants

...  ce stade, les deux se valent ;  toi de choisir.

Il faut quand mme faire les corrections *1* et* 3* expliques dans mon post prcdent.

----------


## junior222

c'est dj fait lattend les instructions pour la suite

----------


## Npomucne

Pour dplacer un ComposantDeplacable dans la DropZone, il faut que le ComposantDeplacable ragisse  l'vnement "drag" de la souris.
On ne va pas utiliser le protocole Drag and Drop car un simple MouseMotionListener sera suffisant en utilisant sa mthode mouseDragged.
Quand on va maintenir la souris appuye sur le ComposantDeplacable la mthode mouseDragged va rcuprer les coordonnes de la souris de cette faon :


```

```

ici j'ai utilis un MouseMotionAdapter pour ne pas avoir  redfinir toutes les autres mthodes du MouseMotionListener.

Ajoute le MouseMotionAdapter au ComposantDeplacable et tche de voir les coordonnes de dplacement de p avec :


```
System.out.println(p);
```

Une fois que tu vois que ces coordonnes s'affichent au fur et  mesure que la souris se dplace,
imagine un systme qui permet alors que le ComposantDeplacable suive le mouvement

----------


## junior222

bon l je suis un peux confus car je dessinais mes composants je devais juste changer les coordonnes et utiliser la mthode repaint() et comme je les ajoutes comment modifier leur position dans mon dropZone?

----------


## Npomucne

Poste  nouveau les deux classes DropZone et ComposantDeplacable que je vois o tu en est

----------


## junior222

bon l j'effectue les dplacements mais le coordonnes sont un peux bizarre car lorsque j'effectue le dplacement dans le dropzone des coordonnes ngatives apparaissent je ne sais pas pourquoi voil mes code:


```

```



```

```

----------


## Npomucne

Bon, c'est pas mal. 
Maintenant, le problme c'est un phnomne de "tremblotement" au moment du dplacement.
Il est caus par l'application directe des nouvelles coordonnes.

Il faut y aller plus doucement et n'appliquer que la diffrence entre l'ancienne position de la souris et la nouvelle position.
Pour cela, on enregistre l'ancienne position en conservant l'vnement prcdent.
1) on cre une variable MouseEvent charge de conserver l'ancienne position


```

```

2) on calcule la diffrence de position et on applique que cette diffrence :


```

```

tu verras que le glissement est nettement plus doux.

----------


## junior222

bon l c'est beaucoup mieux maintenant nous allons aborder la partie la plus difficile la liaisons entre les composants. ici l'ide c'est de relier les composants entre eux avec des lignes qui seront ractives aux clic de la souris je doit avouer que je n'ai aucune ide sur comment faire jattends tes instructions.

----------


## Npomucne

Nan, nan, il ne faut pas attendre  ::nono:: 

Tu dois d'abord essayer par toi-mme car il est possible que tu trouves une meilleure solution que moi.

J'ai t trs 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.

----------


## junior222

ok

----------


## junior222

bon j'essaie de me connecter a ma bd mysql j'ai tlcharger mysql jdbc et lorsque je veux me connecter on m'affiche le message suivant:


```

```

voila mon code:


```

```

----------


## junior222

c'est bon le service mysql ntais pas dmarr

----------


## Npomucne

Et ta liaison entre composants sur la DropZone ?

----------


## junior222

je n'y suit pas encore mon encadreur m'a demand d"diter d'abord les composants. Ceci dit il m'a aussi demand d'utiliser postrgreSQL lorsque je tape la commande suivante en ligne de commande:


```

```

 Sa marche bien mais lorsque je me connecte avec eclipse j'ai un soucis voila mon code:


```

```

et voila l'erreur:


```

```

je ne sais pas quoi faire

----------


## Npomucne

Bon, je connais pas PostGre mais a doit tre tout con.
La trace d'erreur indique Position*: 13 ce qui correspond  la 1re apostrophe
alors essaye sans apostrophe :


```
String req= "insert into public.Etudiant (matricule,nom,prenom,sexe) values ('sefnvze','sdvre','zercze','vercd')";
```

sinon il a vraiment du temps  perdre pour te faire changer de SGBD

----------


## junior222

je l'ai fait sa me dit:


```

```

----------


## Npomucne

On va tourner en rond.
Poste une nouvelle discussion sur le forum JDBC (et peut-tre aussi PostGreSQL)

----------


## junior222

pour la liaison entre les composants mon encadreur m'a recommand d'utiliser le magntisme et je n'ai aucune ide. tu a une ide sur le sujet ou une meilleur ide?

----------


## Npomucne

Ton encadreur a peut-tre un magntisme personnel mais c'est un concept inconnu dans Java  ::mouarf:: 

Srieusement, cela veut dire qu'il faut que le connecteur s'attache automatiquement au ComposantDeplacable ds qu'on le fait passer  proximit.

Avant d'en arriver l :
- as-tu pu rsoudre ton problme de base de donnes ?
- qu'est-ce que tu as dj fait pour programmer le connecteur ?

----------


## junior222

je n'ai pas encore rsolu mon problme de BD mais jtudie une solution pour la seconde question pas grand chose mais je sais ceci le connecteur aura les proprits suivantes 2 composantdeplacable (source et destination), une longueur, un point de dpart et un point d'arriv maintenant il faut pouvoir tracer un trait entre ces 2 composants

----------


## Npomucne

Le connecteur c'est ce qui va relier les ComposantDeplacables

----------


## junior222

oui c'est bien sa. Pour le problme dinsertion c'est bon j'ai rsolu le problme

----------


## junior222

bon voil mon connexteur:


```

```

----------


## junior222

bon voil mon connexteur:


```

```

----------


## junior222

voil aussi composantDeplacable que j'ai modifi:


```

```

----------


## Npomucne

Je ne peux pas tester, il manque la classe BareEtat

----------


## junior222

```

```

----------


## Npomucne

la classe DropTransfertHandler a du tre modifie aussi.
Tu peux la re-poster ?

----------


## junior222

```

```

----------


## Npomucne

a marche pas, la barre tat n'est pas initialis dans DropZone
il faut aussi la placer quelque part non ?

----------


## junior222

en fait j'utilise la classe acceuil pour initialiser:


```

```

----------


## Npomucne

Dans Accueil, il faut ajouter un setVisible(true) 
sinon cela ne marche pas !

et quelle est la manipulation pour relier les composants ?

----------


## junior222

en principe on doit faire un clic droit et cliquer sur initier connexion et un clic droit sur un autre composant et cliquer sur finaliser connexion mais sa ne marche pas pourtant je crois que l'algorithme est bon

----------


## junior222

salut j'ai une proccupation sa fais longtemps que tu ne me rpond plus j'aimerais savoir comment tu as fais avec le connecteur?

----------


## Npomucne

Je suis trs charg en ce moment, je vais essayer de voir cela mercredi

----------


## Robin56

> salut j'ai une proccupation sa fais longtemps que tu ne me rpond plus j'aimerais savoir comment tu as fais avec le connecteur?


Pourquoi le sujet est-il  l'tat rsolu si il reste des points en suspend ?

----------


## junior222

waou mercredi! bref le problme c'est que les dlais sont un peux serrs et c'est la dernire partie du projet. entouka si tu peux avoir le temps s'il te plait essaie de regarder sa.

----------


## Npomucne

> Pourquoi le sujet est-il  l'tat rsolu si il reste des points en suspend ?


Oui, je sais mais junior222 a continu son post avec une question qui semblait anodine et qui a gnr plusieurs pages de questions / rponses
Globalement a peut intresser d'autres dbutants qui ont des problmes avec le drag and drop.
Les erreurs et solutions de la discussion sont assez pdagogiques mme si par moment on tourne un peu en rond.

----------


## Npomucne

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 mthode paintComponent pour tracer ta ligne.

----------


## junior222

bon j'ai fias ce que tu a dit mais j'ai pas toujours de rsultats souhaits voil mes codes:


```

```



```

```



```

```

----------


## junior222

j'ai encore une proccupation y a t-il pas un moyen de fixer un connecteur au un ComposantDeplacable de tel sorte que lorsqu'on dplace ce composant son connecteur se dplace galement?

----------


## Npomucne

> j'ai encore une proccupation y a t-il pas un moyen de fixer un connecteur au un ComposantDeplacable de tel sorte que lorsqu'on dplace ce composant son connecteur se dplace galement?


a on verra quand tu auras corrig les erreurs lmentaires 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 *c*onnexion")){
			con.TerminerConnexion(this);
		}
alors que dans ton JMenuItem il y a "Finaliser *C*onnexion"

donc pour ces raisons, cela ne se dclenche pas.

Tu dois trouver ce genre de petit bugs toi-mme en traant les diffrentes tapes d'excution.
(utilise System.out.println("l'tape que je veux tracer"); pour identifier les endroits effectivement utiliss par ton code)
Sinon on perd un temps considrable et ton dossier n'avance pas.

Aprs 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.

----------


## junior222

oui merci beaucoup je vais suivre ton conseille dornavant 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:


```
this.setBackground(Color.black);
```

lorsque je finalise la connexion un rectangle noir apparait comme prvu mais pas  l'endroit prvu petite modification dans la classe connecteur:


```

```

----------


## Npomucne

getHeight = la hauteur du composant
getwidth = la largeur

les coordonnes sur l'cran (pour un objet Point) sont mesures 
x = position GAUCHE
y = position HAUTE

----------


## junior222

> les coordonnes sur l'cran (pour un objet Point) sont mesures
> x = position GAUCHE
> y = position HAUTE


tu peut expliquer d'avantage s'il te plait?

----------


## Npomucne

Si tu fais un point situ dans un JPanel


```
Point p = new Point(50,120);
```

cela veut dire que ce point est situ :
50 pixels  droite du bord gauche du JPanel
120 pixels sous la bordure haute du JPanel

----------


## sinok

Solution simple et propre qui a t propose dans le thread initial.

N'utiliser qu'un unique composant Swing et tout dessiner dessus.

Et surtout se passer des toute la hirarchie JComponent pour les objets  dessiner.

----------


## Npomucne

> N'utiliser qu'un unique composant Swing et tout dessiner dessus.


Si on n'utilise que du dessin, on perd toute possibilit de cliquer sur les composants pour dclencher des vnements pour les dplacements et les lignes de connexion entre les composants.

On peut, bien sr y arriver avec du dessin. Cependant, cela ncessite de grer des tableaux d'objets qui vont contenir les datas des composants et de dtecter les clics sur leur reprsentation.
Au bout du compte, on aurait re-cr Swing !

Le problme de junior222 est qu'il est dbutant et qu'il a beaucoup de mal  situer les endroits o pche 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 dtecter les erreurs de drag and drop par exemple ou bien de voir qu'il n'a pas initialis un objet Point.

----------


## junior222

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

----------


## Npomucne

Comme je te le disais, commence par vrifier que le paintComponent s'excute bien avec les bonnes coordonnes
et comme on ne va pas passer Nol l-dessus, tu vas corriger dans DropZone la mthode *ajouterConnexion*



```

```

aprs cela, tu verras au moins un trait se tracer ... il n'ira pas dans la bonne direction et tu devras trouver comment corriger les coordonnes.

----------


## junior222

oui apatament le problme n'est pas au niveau des coordonnes parce que je me rend compte que le premier point est toujours le coin suprieur 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 plutt pour effectuer ces manipulations?

----------


## Npomucne

Non, reste sur ton systme de coordonnes.
Cette fois, tu as bien identifi le problme.
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 lment du tableau

----------


## junior222

cela reviens  utiliser 2 connecteurs pour relier 2 composants si je ne me trompe? si oui il faut donc modifier la classe connecteur

----------


## Npomucne

Pas du tout

Il ne faut utiliser qu'un seul connecteur pour relier 2 ComposantDeplacables.
sinon cela va tre ingrable.
D'autant plus que ton connecteur est bien pens : il contient bien le ComposantDeplacable de dpart et le ComposantDeplacable d'arriv. Il ne faut pas changer cela.

dans la pratique :
- retires l'objet 

```
con=new Connecteur(d);
```

 de la classe ComposantDeplacable 
- au moment o tu initialises la connexion 

```
if(e.getActionCommand().equals("Initier connexion")){
```

alors tu cres ton connecteur et tu l'enregistres dans le tableau *listecon* de ta DropZone
- au moment o tu finalises la connexion alors tu vas chercher le dernier lment du tableau et tu demandes un repaint de la DropZone

----------


## junior222

> - au moment o tu finalises la connexion alors tu vas chercher le dernier lment du tableau et tu demandes un repaint de la DropZone


comment je fais cela puisque j'utilise une arraylist

----------


## Npomucne

```

```

----------


## junior222

bon l c'est bon sauf que lorsque j'initialise ma connexion cela part toujours du coin suprieur gauche mais lorsque je finalise sa revient a la normale. dans la dropzone voil mes modifications:


```

```

dans le ccomposantDeplacable:


```

```

maintenant comment faire pour relier le connecteur au composant pour que lorsqu'on dplace le composant le connecteur se dplace galement?

----------


## sinok

> Si on n'utilise que du dessin, on perd toute possibilit de cliquer sur les composants pour dclencher des vnements pour les dplacements et les lignes de connexion entre les composants.
> 
> On peut, bien sr y arriver avec du dessin. Cependant, cela ncessite de grer des tableaux d'objets qui vont contenir les datas des composants et de dtecter les clics sur leur reprsentation.
> Au bout du compte, on aurait re-cr Swing !


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 dtection des clics/dplacements/, deux listeners suffisent amplement. D'autant plus si l'on travaille avec l'interface Shape et ses implmentations qui fournissent une mthode 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, grer les connecteurs qui se croisent et ainsi de suite.

Sans parler des misres lies au setBounds/PreferredSize et ainsi de suite.
Ou alors de pouvoir slectionner un connecteur/objet se trouvant en dessous d'un autre...

Et des problmes de perfs lis au nombres de listeners en place.

Pour ce genre de choses, bypasser (faon de parler, on utilise toujours les listeners) swing est amplement profitable.

----------


## Npomucne

@sinok tu rponds 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 tche de lui donner une rponse qui le fera aller aussi loin que possible.

Il ne s'agit pas de faire un logiciel de CAO pour lectricien.

----------


## junior222

pour l'instant pas besoin de grer des vnements sur les connecteurs car il ne sont l que que pour relier les composants pas plus

----------


## Npomucne

> maintenant comment faire pour relier le connecteur au composant pour que lorsqu'on dplace le composant le connecteur se dplace galement?


Une piste :
Quand l'vnement de dplacement du ComposantDeplacable est dclench, il faut parcourir la liste des connecteurs listecon  (qui se trouve dans DropZone)
Si un connecteur possde le ComposantDeplacable concern alors il faut faire une mise  jour des coordonnes et dclencher un repaint de DropZone

----------


## junior222

voil les modifications apportes au ComposantDeplacable:


```

```

le problme c'est que lorsqu'un composant possde plusieurs liens avec d'autres composant, lorsqu'on le dplace seul la dernire connexion est dplac et les autres ne se dplacent pas

----------


## junior222

j'aimerais galement effectuer une petite simulation tu a des pistes?

----------


## junior222

Pour le deplacements des conecteurs c'est rsolu il fallais juste remplacer:


```

```

par:


```

```

----------


## Npomucne

Bien  ::ccool:: 
tu nous diras quelle note tu auras obtenu ?  ::D:

----------


## junior222

sans problme mais il y a un changement de dernire 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 nud du rseau en trait interrompu rouge. 
Avec sa je crois j'aurais fini si tu a des pistes je suis tout oue

----------


## Npomucne

Dj 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.
aprs, on fait tout dans paintComponent :
pour le mettre dans la drop zone, tu utilises la mthode drawImage (attention, il faut excuter drawImage avant les drawLines sinon l'image va recouvrir les drawLines)

ensuite pour le rouge c'est avec setColor(Color.red)
pour les pointills, vois du ct de setStroke
pour entourer : drawOval

----------


## junior222

bon l je crois que tu n'a pas bien compris ma proccupation je parle d'une carte lectrique pas carte comme tu l'entendais donc cette carte contient des gnrateur des transformateur d'une rgion relis entre eux. le but ici est de se servir de cette carte pour redessiner exactement la mme carte (rseau) mais dans mon application.
De plus il y a un composant nomm bus qui doit tre agrandit ou rtrcie 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

----------


## junior222

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:


```

```



```

```



```

```



```

```

mais les traits ne s'affichent pas!

----------


## junior222

problme de connecteur rsolu juste des erreurs d'inattention je veux maintenant juste augmenter lpaisseur des traits. donc je bloc sur le composants rectangle(drawRect je crois) qui va me permettre d'entourer un nud du rseau car c'est le dessinateur qui  dois dcider de sa taille.

----------


## junior222

bon j'ai fais des progrs pour la zone de slection mais le problmes c'est au niveau des cordonnes de fin qui ne sont pas respects voil les modifications:


```

```



```

```

De plus pour les pointills j'ai vu qu'on faisais sa avec graphics2D or moi j'utilise graphics comment faire?

----------


## sinok

Il te suffit de caster les Graphics fournis en paramtre de paintComponent en Graphics2D.

En effet, les Graphics d'un composant Swing sont systmatiquement des Graphics2D.



```
Graphics2D g2d = (Graphics2D) g;
```

----------


## junior222

bon j'ai trouv pour les style des traits maintenant c'est la zone de slection qui pose problme car les coordonnes ne sont pas respects sa s'affiche n'importe comment voil mes modifications:
dans la dropzone


```

```

De plus y aurais t-il pas un moyen de grer les ventements sur les trait que je dessine?

----------


## sinok

Il faut que le composant sur lequel tu dessine coute les divers vnements, et qu' chaque vnement tu sois capable de dterminer si le point auquel se situe l'vnement se situe sur un de tes traits.

Ds lors que tu as stock les coordonnes de tes traits, c'est une simple quation  rsoudre, du niveau quatrime

----------


## junior222

> Il faut que le composant sur lequel tu dessine coute les divers vnements, et qu' chaque vnement tu sois capable de dterminer si le point auquel se situe l'vnement se situe sur un de tes traits.
> 
> Ds lors que tu as stock les coordonnes de tes traits, c'est une simple quation  rsoudre, du niveau quatrime


bon j'ai suivit tes conseils et j'ai rsolu lquation de droite y=ax+b et pour chaque trait tracer sur le graphe je teste si le point sur lequel la souris pointe appartient  la droite voil l'extrait de mon code mais je n'ai aucun rsultat:


```

```

 En passant mon problme de slection n'est toujours pas rsolu

----------


## sinok

Se pourrait il qu'il y ait d'autres composants au dessus de celui que tu essaies de slectionner?

Accessoirement, slectionner un point trs prcis  la souris est en gnral assez chiant ) faire, donc essaie de donner un marge d'erreur autours (genre  calculer un rectangle englobant ta droite, et voir si celui ci contient le point o se trouve la souris)...

----------


## junior222

> Accessoirement, slectionner un point trs prcis  la souris est en gnral assez chiant ) faire, donc essaie de donner un marge d'erreur autours (genre calculer un rectangle englobant ta droite, et voir si celui ci contient le point o se trouve la souris)...


peut-tu expliquer un peux mieux parce que l je ne voit pas comment faire

----------


## junior222

voil ce que j'ai implment mais jusque l aucun rsultat:


```

```

----------


## sinok

As tu bien ajout ton MouseListener  ton composant?

----------


## junior222

voil toute ma classe


```

```

----------


## sinok

Le mouseEntered n'est absolument pas prvu pour a il ne s'excute que quand la souris arrive sur un composant.

C'est dans le mouseMouved que tu dois faire cette dtection.

Seconde chose, pour des raisons de performance, il faut que tu vites  tout prix de charger des images dans la mthode paintComponent.

Donc le 

```
Image image = ImageIO.read(Acceuil.class.getResource("/image/fond.png"));
```

doit tre fait dans le constructeur, et il faut qu'image soit un des attributs de ta classe.

----------


## junior222

bon l j'ai fait ce que tu as dit mais le problme c'est que lorsque je passe sur un trait le curseur change bien mais lorsque je ne suis plus sur le trait il ne reprend pas sa forme initial. De pus tu n'aurais pas une ide sur mon problme de zone de slection, lorsque je la dessine elle ne suit pas les coordonnes de la souris.

----------


## sinok

Il faut que tu remettes le curseur standard quand tu n'es plus sur le trait. (donc tester dans le mousemoved si tu es sur un trait et avoir une variable boolenne dans la classe indiquant si te te trouvais pralablement sur un trait, histoire de ne pas faire des setCursor en permanence).
Pour ta zone de slection, tu dois faire un mauvais calcul dans le mouseDragged ou dans ton paintComponent, mais n'ayant pas suivi le truc, j'ai un poil la flemme de reprendre tout l'historique du truc...

----------


## junior222

le problme c'est que la classe ou je dessine et celle ou je dois tester sont pareilles donc je suis un peux confus en plus pour le problme de slection c'est pas un problme de coordonnes mais je crois que il me manque une astuce

----------

