Publié le 06/05/2014
Auteur axel
Réseaux sociaux
0 partages
0 tweets
0 plus
2 commentaires

Deplacer une image a l'execution

Comment déplacer une image avec la souris dans une interface JAVA ? La technique dans l'exemple ci-dessous s'apparente à du Drag and Drop, par contre à y regarder de plus près aucun composant n'est réellement déplacé.

Ajouter une Image à un JPanel

Le composant DraggableImage est un JPanel dans lequel une image est affichée. L'image est chargée dans le constructor puis dessiner à chaque reprise dans l'évènement paintComponent().

Simuler le déplacement de l'image

Lorsque le bouton de la souris est pressé sur l'image, la class MouseAdapterImage détecte le début d'un déplacement et enregistre les coordonnées sur cursor. Au déplacement du curseur, l'événement mouseDragged calcule la nouvelle position à donner à l'image.
Puis il est demandé au JPanel de rafraichir son aspect dans lequel l'image est dessinée à la nouvelle position.
Copier l'exemple ci-dessous dans votre editeur JAVA préféré, attention veuillez mettre à jour le lien vers l'image.
/**
 * Déplacer une image à l'execution
 * @author Axel 05/2014
 * @see http://www.fobec.com/java/1143/deplacer-une-image-execution.html
 */
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class DraggableImage extends JPanel {
    //Variable globale
    private BufferedImage img;
    private Point curPos;
 
    /**
     * Constructor
     */
    public DraggableImage() {
        //Initialisation de la position actuelle
        this.curPos = new Point(0, 0);        
 
        // Charger l'image dans le JPanel
        // !!! Mettre une image existant sur votre poste de travail
        try {
            img = ImageIO.read(new File("c://tux.png"));
        } catch (IOException ex) {
            Logger.getLogger(DraggableImage.class.getName()).log(Level.SEVERE, null, ex);            
        }
 
        //Lier l'écouteur de la souris
        MouseAdapterImage mouseAdapterImage = new MouseAdapterImage();
        addMouseListener(mouseAdapterImage);
        addMouseMotionListener(mouseAdapterImage);
    }
 
    /**
     * Dessiner l'image
     * @param g 
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            Graphics2D g2d = (Graphics2D) g.create();
            if (curPos == null) {
                curPos = new Point(0, 0);
            }
            g2d.drawImage(img, curPos.x, curPos.y, this);
            g2d.dispose();
        }
    }
 
    /**
     * Class hérité de MouseAdapter
     */
    class MouseAdapterImage extends MouseAdapter {
 
        private Point newPos;
 
        /**
         * Le bouton gauche est pressé
         * @param e 
         */
        @Override
        public void mousePressed(MouseEvent e) {
            newPos = e.getPoint();
            newPos.x -= curPos.x;
            newPos.y -= curPos.y;
            setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
        }
 
        /**
         * Le bouton gauche est relaché
         * @param e 
         */
        @Override
        public void mouseReleased(MouseEvent e) {
            newPos = null;
            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        }
 
        /**
         * Le curseur de la souris est déplacé
         * @param e 
         */
        @Override
        public void mouseDragged(MouseEvent e) {
            Point p = e.getPoint();
            int x = p.x - newPos.x;
            int y = p.y - newPos.y;
            curPos = new Point(x, y);
            repaint();
        }
    };
 
    /**
     * Exemple d'utilisation dans un JFrame
     * @param args 
     */
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("Deplacer une image");
        DraggableImage resi = new DraggableImage();
        jFrame.add(resi);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(300, 300);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }
}

La technique du déplacement d'une image sur un JPanel est simple à mettre en place. Par exemple, elle pourrait etre utilisée dans un jeu de carte dans lequel les images sont déplacées sur une pile à partir du tapis.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.
avatar Alpcom

Publié par Alpcom

le 26/09/2014 à 19:54:45

Salut , juste signaler une petite faute de frappe dans mouseDragged
ce n'est pas int y = p.y - newPos.x;
int y = p.y - newPos.y; !! des comportements curieux apparaissaient sinon merci beaucoup de partager ce bout de code que je chercher depuis un certain temps

avatar Axel

Publié par Axel

le 27/09/2014 à 09:25:50

la position sur mouseDragged a ete corrigee dans l'article.
Merci Alpcom !

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - sources
Mise a jour
06/05/2014
Visualisation
vu 5373 fois
Public
Internaute
Auteur de la publication
Axel
Membre junior
Auteur de 51 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Berenger dans java

Bonjour Mr Foebec je suis vraiment très content de cette réponse vous êtes simplement génial. quand je pense au nombre de jour que ça m'a pris et le temps que j'ai pe...

Publié par fredouille dans java

Il ne faut pas oublier de mettre aussi System.setErr(printStream); pour ne pas oublier les printStackTrace() declenches par le catch

Publié par OmegaPlatypus dans java

Dans mon cas, plusieurs lettres etaient repetes plusieurs fois, dont la derniere a l'indfiniment. En ajoutant robot.keyReleaseKeyEvent.VK_A, robot.keyReleaseKeyEvent.VK_X, etc. apres chacune des frap...

Publié par pidjey dans php5

J'ai bien lu mais c'est vraiment trop fort et trop dur pour le moment, je sais pas vraiment comprendre vos syntaxes, elles sont enormes et moi, je ne suis qu'encore un debutant en PHP et il faudrait p...

Publié par Fobec dans news

Votre message a ete deplace sur le forum, ce sera plus facile pour en discuter.
http://www.fobec.com/forum/correspondance-entre-adresse-ipv4-adresse-ipv6-t1146.html