Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DRAG-DROP UNE FORME GÉOMETRIQUE


Information sur la source

Catégorie :Java2D Classé sous : Drag, Drop, Forme géométrique, Double-Buffering, Arthur Griffith Niveau : Débutant Date de création : 01/03/2008 Date de mise à jour : 01/03/2008 15:32:51 Vu / téléchargé: 5 645 / 215

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Suite à de nombreuses questions dans le forums qui demandent comment faire simuler le drag&drop d'une forme géométrique.

Je poste la présente source pour répondre à toutes ces questions.

La présente source est inspirée d'un cours de formation en Java 2 de Mr. [Arthur Griffith].

Elle montre comment faire glisser un carré dans une fenêtre et le surtout elle offre l'avantage d'utiliser la technique du [Double-Buffering] artificielle pour assurer la fluidité de l'affichage en utilisant une image intermédiaire.

A.B.
 

Source

  • /**
  • *
  • */
  • package com.ab.javafr;
  • import java.awt.AlphaComposite;
  • import java.awt.Canvas;
  • import java.awt.Color;
  • import java.awt.Graphics;
  • import java.awt.Graphics2D;
  • import java.awt.Image;
  • import java.awt.Rectangle;
  • import java.awt.event.MouseEvent;
  • import java.awt.event.MouseListener;
  • import java.awt.event.MouseMotionListener;
  • /**
  • * @author A.B.
  • *
  • */
  • public class DraggableShape extends Canvas implements MouseMotionListener, MouseListener {
  • /** Largeur du carré */
  • public static final int SIDE = 50;
  • /** Indique si le carré est en mouvement ou non */
  • private boolean moving = false;
  • /** Abscisse du coin supérieur-gauche */
  • private int xPosition;
  • /** Ordonnée du coin supérieur-gauche */
  • private int yPosition;
  • /** Abscisse du point où on fait glisser le carré */
  • private int xDragg;
  • /** Ordonnée du point où on fait glisser le carré */
  • private int yDragg;
  • /**
  • * Rectangle qui représente le périmètre de la fenêtre.
  • * Cette attribut sert essentiellement à capter si la fenêtre a été redimensionner.
  • */
  • private Rectangle frameRect;
  • /**
  • * Pour assurer la fluidité du mouvement du carré sans qu'il aura des troubles
  • * On se sert de cet attribut pour simuler la technique du double-buffering.
  • */
  • private Image doubleBufferImage;
  • /**
  • * Crée une nouvelle instance de la classe 'DraggableShape'.
  • */
  • public DraggableShape() {
  • setSize(400, 400);
  • frameRect = new Rectangle(401, 401);
  • addMouseListener(this);
  • addMouseMotionListener(this);
  • }
  • /**
  • * Quand on maintient une touche de la souris enfoncée et on fait glisser le curseur.
  • */
  • public void mouseDragged(MouseEvent e) {
  • if (moving) {
  • xPosition = e.getX() - xDragg;
  • yPosition = e.getY() - yDragg;
  • repaint();
  • }
  • }
  • @Override
  • public void paint(Graphics g) {
  • // Créer un objet de type Graphics2D
  • Graphics2D g2 = (Graphics2D)g;
  • // Colorer le fond en blanc
  • g2.setColor(Color.WHITE);
  • g2.fillRect(0, 0, frameRect.width, frameRect.height);
  • // Dessiner le carré en rouge
  • g2.setColor(Color.RED);
  • g2.fillRect(xPosition, yPosition, SIDE, SIDE);
  • // Dessiner un contour transparent en bleu pour simuler l'effet de séléction
  • if (moving) {
  • g2.setColor(Color.BLUE);
  • g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .3f));
  • g2.fillRect(xPosition - 5, yPosition - 5, SIDE + 10, SIDE + 10);
  • }
  • }
  • @Override
  • public void update(Graphics g) {
  • if (!frameRect.equals(getBounds())) {
  • frameRect = getBounds();
  • doubleBufferImage = createImage(frameRect.width, frameRect.height);
  • }
  • // Ne pas dépasser les bords de la fenêtre
  • if (xPosition < 0) {
  • xPosition = 0;
  • } else if (xPosition > (frameRect.width - SIDE)) {
  • xPosition = frameRect.width - SIDE;
  • }
  • // Ne pas dépasser les bords de la fenêtre
  • if (yPosition < 0) {
  • yPosition = 0;
  • } else if (yPosition > (frameRect.height - SIDE)) {
  • yPosition = frameRect.height - SIDE;
  • }
  • // Dessiner sur l'image intermédiaire
  • Graphics imageGraphics = doubleBufferImage.getGraphics();
  • paint(imageGraphics);
  • // Afficher l'image intermédiaire
  • g.drawImage(doubleBufferImage, 0, 0, this);
  • }
  • public void mouseMoved(MouseEvent e) {
  • }
  • public void mouseClicked(MouseEvent e) {}
  • public void mouseEntered(MouseEvent e) {}
  • public void mouseExited(MouseEvent e) {}
  • public void mousePressed(MouseEvent e) {
  • int x = e.getX();
  • if ((x < xPosition) || (x > (xPosition + SIDE))) {
  • return;
  • }
  • int y = e.getY();
  • if ((y < yPosition) || (y > (yPosition + SIDE))) {
  • return;
  • }
  • xDragg = x - xPosition;
  • yDragg = y - yPosition;
  • moving = true;
  • }
  • public void mouseReleased(MouseEvent e) {
  • if (moving) {
  • xPosition = e.getX() - xDragg;
  • yPosition = e.getY() - yDragg;
  • moving = false;
  • repaint();
  • }
  • }
  • }
/**
 * 
 */
package com.ab.javafr;

import java.awt.AlphaComposite;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

/**
 * @author A.B.
 *
 */
public class DraggableShape extends Canvas implements MouseMotionListener, MouseListener {

	/** Largeur du carré */
	public static final int SIDE = 50;
	
	/** Indique si le carré est en mouvement ou non */
	private boolean moving = false;
	
	/** Abscisse du coin supérieur-gauche */
	private int xPosition;
	
	/** Ordonnée du coin supérieur-gauche */
	private int yPosition;
	
	/** Abscisse du point où on fait glisser le carré */
	private int xDragg;
	
	/** Ordonnée du point où on fait glisser le carré */
	private int yDragg;
	
	/** 
	 * Rectangle qui représente le périmètre de la fenêtre.
	 * Cette attribut sert essentiellement à capter si la fenêtre a été redimensionner.
	 */
	private Rectangle frameRect;
	
	/**
	 * Pour assurer la fluidité du mouvement du carré sans qu'il aura des troubles
	 * On se sert de cet attribut pour simuler la technique du double-buffering. 
	 */
	private Image doubleBufferImage;
	
	/**
	 * Crée une nouvelle instance de la classe 'DraggableShape'.
	 */
	public DraggableShape() {
		setSize(400, 400);
		frameRect = new Rectangle(401, 401);
		addMouseListener(this);
		addMouseMotionListener(this);
	}
	
	/**
	 * Quand on maintient une touche de la souris enfoncée et on fait glisser le curseur.
	 */
	public void mouseDragged(MouseEvent e) {
		if (moving) {
			xPosition = e.getX() - xDragg;
			yPosition = e.getY() - yDragg;
			repaint();
		}
	}

	@Override
	public void paint(Graphics g) {
		// Créer un objet de type Graphics2D
		Graphics2D g2 = (Graphics2D)g;

		// Colorer le fond en blanc
		g2.setColor(Color.WHITE);
		g2.fillRect(0, 0, frameRect.width, frameRect.height);
		
		// Dessiner le carré en rouge
		g2.setColor(Color.RED);
		g2.fillRect(xPosition, yPosition, SIDE, SIDE);
		
		// Dessiner un contour transparent en bleu pour simuler l'effet de séléction
		if (moving) {
			g2.setColor(Color.BLUE);
			g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .3f));
			g2.fillRect(xPosition - 5, yPosition - 5, SIDE + 10, SIDE + 10);
		}
	}
	
	@Override
	public void update(Graphics g) {
		if (!frameRect.equals(getBounds())) {
			frameRect = getBounds();
			doubleBufferImage = createImage(frameRect.width, frameRect.height);
		}
		
		// Ne pas dépasser les bords de la fenêtre
		if (xPosition < 0) {
			xPosition = 0;
		} else if (xPosition > (frameRect.width - SIDE)) {
			xPosition = frameRect.width - SIDE;
		}
		
		// Ne pas dépasser les bords de la fenêtre
		if (yPosition < 0) {
			yPosition = 0;
		} else if (yPosition > (frameRect.height - SIDE)) {
			yPosition = frameRect.height - SIDE;
		}
		
		// Dessiner sur l'image intermédiaire
		Graphics imageGraphics = doubleBufferImage.getGraphics();
		paint(imageGraphics);
		
		// Afficher l'image intermédiaire
		g.drawImage(doubleBufferImage, 0, 0, this);
	}
	
	public void mouseMoved(MouseEvent e) {
	}

	public void mouseClicked(MouseEvent e) {}

	public void mouseEntered(MouseEvent e) {}

	public void mouseExited(MouseEvent e) {}

	public void mousePressed(MouseEvent e) {
		int x = e.getX();
		if ((x < xPosition) || (x > (xPosition + SIDE))) {
			return;
		}
		
		int y = e.getY();
		if ((y < yPosition) || (y > (yPosition + SIDE))) {
			return;
		}
		
		xDragg = x - xPosition;
		yDragg = y - yPosition;
		moving = true;
	}

	public void mouseReleased(MouseEvent e) {
		if (moving) {
			xPosition = e.getX() - xDragg;
			yPosition = e.getY() - yDragg;
			moving = false;
			repaint();
		}
	}

}

Conclusion

Bon courage ...

A.B.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Twinuts le 01/03/2008 17:50:45 administrateur CS

Salut,

tu pourrais stp implémenter cette solution dans un autre package plus advanced afin d'avoir une solution la plus complète possible :
http://gfx.developpez.com/tutoriel/java/swing/drag/

signaler à un administrateur
Commentaire de Ombitious_Developper le 01/03/2008 20:07:56

Salut:

Me voilà après une petite sieste.

Pas de problème je vais essayer de voir comment améliorer cette source.

Le fait que je vois dans l'URL que tu as fournis [GFX] me motive beaucoup parceque j'aime bien lire les articles de Guy Romain.

Cordialement ...

signaler à un administrateur
Commentaire de Ombitious_Developper le 01/03/2008 20:09:40

Salut:

Twinuts >> Selon toi quelles sont les améliorations à envisager?

signaler à un administrateur
Commentaire de gouessej le 01/03/2008 22:32:57 8/10

C'est pas mal. Il faudrait si possible que tu répartisses mieux les responsabilités en faisant plusieurs classes, une qui gère un carré, une autre qui gère la fenêtre sur laquelle tu déplaces un ou plusieurs carrés. C'est propre et commenté.

signaler à un administrateur
Commentaire de Twinuts le 02/03/2008 14:14:45 administrateur CS

Salut,

tu peux utiliser un mask semi transparent de la forme d'origine lors du déplacement afin d'avoir un petit effet sympatoche...

signaler à un administrateur
Commentaire de Twinuts le 02/03/2008 15:46:54 administrateur CS

Salut,

au passage tu pourrais éviter d'utiliser la méthode 'repaint()' mais plus 'repaint(rectangle)' afin de ne pas redessiner TOUT le Canvas mais plus une zone prédéfinie soit l'ancienne position + la nouvelle

signaler à un administrateur
Commentaire de gouessej le 02/03/2008 15:57:28

Le RepaintManager fait peut-être déjà appel à repaint(Rectangle) quand tu utilises repaint(), ça dépend si on lui a indiqué que certains composants devaient être redessinés ou si autre chose dans Java appelle addDirtyRegion() quand on bouge le composant par exemple.

signaler à un administrateur
Commentaire de Twinuts le 02/03/2008 16:18:07 administrateur CS

Salut,

ouep bah perso je ne fais plus confiance en ce que pourrait ou non faire les manager de java... de plus ici tu es dans un canvas donc limite le paint manager va repaint TOUT le canvas... mais tu peux toujours faire un test tu verras qu'il redessine TOUT

signaler à un administrateur
Commentaire de DARKSIDIOUS le 02/03/2008 19:30:18 administrateur CS

et après le "comment on fait pour déplacer un rectangle", voici le "comment on fait pour agrandir le rectangle" !

On s'en sortira pas de ces newbs !

signaler à un administrateur
Commentaire de Twinuts le 02/03/2008 19:44:11 administrateur CS

mdrrrrr, et ça risque pas de s'arranger...

signaler à un administrateur
Commentaire de Ombitious_Developper le 02/03/2008 20:02:16

Au travail !!!

signaler à un administrateur
Commentaire de DARKSIDIOUS le 02/03/2008 20:30:21 administrateur CS

oui ca sans le devoir à la maison à plein nez :p

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

[Swing] Drag'n'drop dans un JTree [ par breed1200 ] Salut!Voila mon problème:J'ai un jtree composé d'objets (pas des simples string) et j'aimerais savoir comment faire du dragndrop dessus. J'ai regardé copy, paste,drag and drop [ par srodrigues ] Bonjour,Je suis en train de realiser un petit projet. ce projet c'est un filemanager (une sorte de windows explorer). Mais je suis arrive à un stade o Drag Drop dans une JTable [ par gollum50 ] Voilà je voudrai sélectionner le contenu d'une cellule de ma table et la déposer dans n'importe quelle autre cellule. Je sais pas si c possible, mais drag and drop dans une toolbar [ par djanele38 ] Bonjour a tous,Je souhaiterais mettre en place un drag & drop dans une toolbar. Quelqu'un aurait-il une idée de comment je pourrais l'implémenter et s drag n drop multiple items [ par eblood ] Hello,j'ai un gros gros probl&#232;me, je voudrais faire un drop multiple d'une JList vers une Jtable. Par 'multiple' je veux dire que je s&#233;lecti Drag Drop AWT Reconnaissance d'objet [ par maitredede ] Bonjour Je fait du drag and drop dans un applet en awt. Je drag un objet de mon applet et je le drop sur un autre : une image (d&#233;riv&#233;e d'un drag and drop d'un fichier pour outlook [ par didrocks ] Bonjour! J'aimerais pouvoir cr&#233;er un drag and drop, de sorte que la sortie puisse &#234;tre gliss&#233;e sur un mail outlook. Je m'explique mieux drag & drop de jcomponent graphique2D d'un jpanel à un autre jpanel [ par javademerde ] bonjour tout le monde des programmeurs, g un probl&#232;me de poids sur lequel je me penche depuis 2 semaines sans r&#233;sultats. Je cr&#233;e un jeu [SWT] Plusieurs Drag & Drop dans une interface [ par lessecs ] Bonjour, je suis entrain de faire une interface en SWT avec deux tableaux. Je veux faire deux Drag &amp; Drop, l'un pour faire passer des donn&#233;es Drag n Drop [ par zied1982 ] Salut,j'ai une interface graphique avec Jbuilder X qui est divis&#233;e en deux JPanel. Le premier JPanel contient quelques JButton.Comment d&#233;pla


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.