IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Drag'n drop avec GhostGlassPane


Sujet :

AWT/Swing Java

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut Drag'n drop avec GhostGlassPane
    Bonjour,
    Je suis en train d'essayer d'implémenter le drag'n drop qu'on trouve sur http://gfx.developpez.com/tutoriel/java/swing/drag/ et qui utilise un GhostGlassPane pour faire quelque chose de plutôt joli/intuitif visuellement. Sauf que je ne m'en sors pas malgré les explications.

    Voici une description de mon appli (copie d'écran en pièce jointe).
    Un écran swing avec :
    - à gauche : le dessin d'une silhouette humaine et comprenant 4 ronds qui servent à indiquer le matériel porté sur la tête (casque par exemple), sur le corps (une armure par exemple) et aux deux mains (une épée, une hache ...)
    - à droite : un tableau listant l'équipement disponible (sous forme d'images)
    - On peut drag'n dropper un équipement du tableau vers un des 4 ronds de la silhouette humaine. En faisant cela, l'image de l'équipement choisi apparait dans le rond.

    J'ai réussi à implémenter une partie puisque j'ai bien le drag qui s'active avec l'image de l'équipement qui suit la souris, c'est ce qu'on voit dans la pièce jointe avec une hache que j'ai glisser depuis le tableau jusqu'à la main gauche.
    Par contre le drop ne fonctionne pas correctement : il s'active à n'importe quel endroit où je droppe alors que je veux qu'il ne fonctionne que sur les 4 ronds de la silhouette et qu'en plus il ne s'active que pour le 4 du drop. Or actuellement non seulement il droppe n'importe où mais en plus il ne détecte pas le composant sur lequel il droppe (même quand je droppe au dessus d'un rond).

    Merci d'avance pour votre aide

    Voici une version simplifiée de mon code :
    // Toutes les classes de http://gfx.developpez.com/tutoriel/java/swing/drag/
    GhostPictureAdapter ...
    GhostGlassPane ...
    GhostDropAdapter ...
    ...


    // SlotEquipement
    // Composant swing personnalisé
    // => Dessine un rond avec l'image de l'équipement porté si il y en a un
    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
     
    public class SlotEquipement extends JComponent {
    	private Image	image;
     
    	public SlotEquipement() {
    		super();
    		this.image =  null;
    	}
     
    	public SlotEquipement(Image image) {
    		super();
    		this.image =  image;
    	}
     
    	public void setImage(Image image) {
    		this.image =  image;
    	}
     
    	@Override
    	public void paintComponent(Graphics g) {
    		Graphics2D g2d = (Graphics2D)g;
    		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     
    		// ----------------------------------------
    		// DESSINER LE ROND
    		// ----------------------------------------
    		g2d.setColor(Color.BLACK);
    		g2d.drawOval(0, 0, 60, 60);
     
    		g2d.setColor(new Color(10, 10, 10, 15));
    		g2d.fillOval(0, 0, 60, 60);
     
    		// ----------------------------------------
    		// DESSINER L'IMAGE
    		// ----------------------------------------
    		if(image!=null) g2d.drawImage(image, 5, 5, null);
    	}
    }
    // FichePersonnage
    // La classe affichant la fenêtre swing et son contenu (silhouette humaine, ronds de l'équipement porté, tableau de l'équipement disponible)
    // Je ne mets pas dans le code la gestion du positionnement des objets swing (pas de layout ...) car ça n'a pas de rapport avec le pb
    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
     
    public class FichePersonnage extends JInternalFrame {
    	private	JPanel			panel;
     
    	private	GhostGlassPane		glassPane;
     
    	private	GhostDropListener	listenerTete;
    	private	GhostDropListener	listenerCorps;
    	private	GhostDropListener	listenerMainGauche;
    	private	GhostDropListener	listenerMainDroite;
     
    	private	Personnage 		personnage;
     
    	public FichePerso(Personnage personnage) {
    		this.personnage	= personnage;
     
    		glassPane		= new GhostGlassPane( );
    		setGlassPane(glassPane);
    		...
    		afficheSilhouette();
    		afficheTableau();
    		...
    	}
     
    	// Affiche la silhouette et les ronds d'équipement
    	// Pour chaque rond, on lui affecte un "listener de drop"
    	public void afficheSilhouette() {
    		// Ajout de la silhouette
    		JLabel lbSilhouette	= new JLabel(new ImageIcon("silhouette.jpg");
    		panel.add(lbSilhouette);
     
    		// Ajout du slot d'équipement pour la tête
    		SlotEquipement slotTete	= new SlotEquipement();
    		panel.add(slotTete);
    		listenerTete = new GhostDropManager(slotTete);
     
    		// Ajout du slot d'équipement pour le corps
    		SlotEquipement slotCorps	= new SlotEquipement();
    		panel.add(slotCorps);
    		listenerCorps = new GhostDropManager(slotCorps);
     
    		// Ajout du slot d'équipement pour la main gauche
    		SlotEquipement slotMainGauche= new SlotEquipement();
    		panel.add(slotMainGauche);
    		listenerMainGauche = new GhostDropManager(slotMainGauche);
     
    		// Ajout du slot d'équipement pour la main droite
    		SlotEquipement slotMainDroite= new SlotEquipement();
    		panel.add(slotMainDroite);
    		listenerMainDroite = new GhostDropManager(slotMainDroite);
    	}
     
    	// Affiche le tableau avec les équipements disponibles//
    	// chaque équipement est représenté par son image (jlabel)
    	// Pour chaque équipement, on créé un mouse adapter qui affichera l'image en cours de drag'n drop. Et on ajoute les listener de drop des 4 ronds de la silhouette.
    	public void afficheTableau() {
    		JPanel panelTableau	= new JPanel();
    		for(Equipement equip:personnage.getListeEquip()) {
    			JLabel lbBien	= new JLabel(equip.getImage());
    			panelTableau.add(lbBien);
     
    			GhostDropAdapter pictureAdapter	= new GhostPictureAdapter(glassPane, equip.getNom(), equip.getImage());
    		        pictureAdapter.addGhostDropListener(listenerTete);
    		        pictureAdapter.addGhostDropListener(listenerCorps);
    		        pictureAdapter.addGhostDropListener(listenerMainGauche);
    		        pictureAdapter.addGhostDropListener(listenerMainDroite);
     
    			lbBien.addMouseListener(pictureAdapter);
    			lbBien.addMouseMotionListener(new GhostMotionAdapter(glassPane));
    		}
    		panel.add(panelTableau);
    	}
    }
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drag'N'Drop avec GhostGlassPane (image fixe)
    Par arnaud.tlse dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 19/08/2011, 08h50
  2. Réponses: 6
    Dernier message: 18/12/2007, 09h16
  3. Drag and drop avec SDL et le langage C.
    Par GSébastien dans le forum SDL
    Réponses: 4
    Dernier message: 13/12/2007, 01h34
  4. [AJAX] Drag and Drop avec AJAX
    Par bonano dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/03/2007, 22h44
  5. "Drag and drop" avec directinput
    Par batosai dans le forum DirectX
    Réponses: 1
    Dernier message: 16/06/2004, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo