Drag-drop une forme géometrique

Soyez le premier à donner votre avis sur cette source.

Vue 13 673 fois - Téléchargée 787 fois

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 / Exemple :


/**

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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_DARKSIDIOUS
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
92
oui ca sans le devoir à la maison à plein nez :p
Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Au travail !!!
Twinuts
Messages postés
5345
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
11 février 2020
90
mdrrrrr, et ça risque pas de s'arranger...
cs_DARKSIDIOUS
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
92
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 !
Twinuts
Messages postés
5345
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
11 février 2020
90
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.