Drag-drop une forme géometrique

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

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.