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
[FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : SQLRE : SQL par Julien39
Cliquez pour lire la suite par Julien39
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|