Accueil > > > DRAG-DROP UNE FORME GÉOMETRIQUE
DRAG-DROP UNE FORME GÉOMETRIQUE
Information sur la source
Description
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.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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ème, je voudrais faire un drop multiple d'une JList vers une Jtable. Par 'multiple' je veux dire que je sé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érivée d'un
drag and drop d'un fichier pour outlook [ par didrocks ]
Bonjour! J'aimerais pouvoir créer un drag and drop, de sorte que la sortie puisse être glissé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ème de poids sur lequel je me penche depuis 2 semaines sans résultats. Je cré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 & Drop, l'un pour faire passer des données
Drag n Drop [ par zied1982 ]
Salut,j'ai une interface graphique avec Jbuilder X qui est divisée en deux JPanel. Le premier JPanel contient quelques JButton.Comment dépla
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|