begin process at 2010 02 10 05:04:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Java2D

 > DRAG-DROP UNE FORME GÉOMETRIQUE

DRAG-DROP UNE FORME GÉOMETRIQUE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :7 584 / 358

Auteur : Ombitious_Developper

Ecrire un message privé
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

JOUR ASSOCIÉ À UNE DATE DONNÉE
Source avec Zip Source avec une capture EJECTER / FERMER CD-ROM / DVD-ROM (JNI + WINDOWS)
Source avec Zip LOUPE EN JAVA

 Sources de la même categorie

AFFICHER UNE ÉTOILE AVEC JAVA2D par 2mohamed2
TEXTE AVEC OMBRE par 2mohamed2
Source avec Zip Source avec une capture JBOXIKON PORTAGE DE BOXIKON par ulm950
Source avec Zip Source avec une capture AQUARIUM 2D AVEC DOUBLE-BUFFERING ET EN UTILISANT UNIQUEMENT... par Cornellus1985
Source avec Zip Source avec une capture JPANELTEXTEDEFILANT : FAIRE DEFILER DU TEXTE (PLUSIEURES MAN... par loloof64

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture AQUARIUM 2D AVEC DOUBLE-BUFFERING ET EN UTILISANT UNIQUEMENT... par Cornellus1985
Source avec Zip Source avec une capture JTABBEDPANE FERMABLE AVEC GESTION DU DRAG AND DROP par indiana_jules

Commentaires et avis

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/

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

Commentaire de Ombitious_Developper le 01/03/2008 20:09:40

Salut:

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

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

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

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

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.

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

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 !

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

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

Commentaire de Ombitious_Developper le 02/03/2008 20:02:16

Au travail !!!

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales