IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

déplacement image


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    HiT
    HiT est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Par défaut déplacement image
    bonjour, je souhaiterais pouvoir déplacer une image dans un panel style mappy... cela fonctionne mais avec deux gros problèmes:
    le premier est que le panel dans lequel se trovue l'image est plus grand donc meme en cliquant à coté de l'image je peux la déplacer --> je ne sais pas comment faire pour ne déplacer que l'image (cf code)
    le deuxieme problème est que j'aimerais que cela soit comme sous mappy, que l'image ne puisse pas complètement sortir du cadre mais je ne sais pas comment l'arréter.
    Problème annexe, je me dis qu'il serait alors peut être interessant que mon affichage ne soit pas redimensionnable par l'utilisateur, que la taille soit fixe, mais je ne sais pas quel parametre mettre en disable...
    merci par avance de votre aide

    et désolé si j'ai des questions bêtes, je débute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
     
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.*;
    import java.awt.image.*;
     
    import java.io.*;
     
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.event.*;
     
    import javax.imageio.*;
     
    public class Map extends JFrame {
     
      //Variables d'instance
      protected MapPane mapPane;
      protected BufferedImage image;
      protected JSlider curseur = new JSlider(JSlider.VERTICAL, 1, 3, 1);
     
    //constructeur par défaut
      public Map() throws Exception {
        //Initialisation du JPanel
        // Lecture de l'image 
        image = ImageIO.read(new File("carteIHM.jpg"));
        //Ajout du contenu
        mapPane = new MapPane(image);
        //mapPane.setBorder(new TitledBorder("Map"));
        curseur.setMajorTickSpacing(1);
        curseur.setMinorTickSpacing(1);
        curseur.setPaintLabels(true);
        curseur.setPaintTicks(true);
        curseur.setSnapToTicks(true);
        setLayout(new BorderLayout());
        //essai sans JScrollPane********************
        //add(new JScrollPane(mapPane), BorderLayout.CENTER);
        JPanel panel=new JPanel(new GridLayout(1,1)); 
        panel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
        panel.add(mapPane);
        add(panel, BorderLayout.CENTER);
        panel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
            	JPanel cadre = (JPanel) e.getSource();
    			cadre.setLocation(cadre.getX()+e.getX(),cadre.getY()+e.getY());
                repaint();
             }
          }); 
        //essai********************************
        add(curseur, BorderLayout.EAST);
    //  événement curseur
        curseur.addChangeListener(new ChangeListener() {
        	 public void stateChanged(ChangeEvent e) {
        		 JSlider curseur = (JSlider) e.getSource();
        		 int scale = curseur.getValue();
        		 mapPane.setScale(scale);
        		 repaint();
        	 	}
        	});
     
      	}
     
    //fonction main qui se contente de créer une new map
      public static void main(String[] args) {
        try {
          Map map = new Map();
          map.setSize(750, 600);
          map.setTitle("Carte à moutons");
          map.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          map.setVisible(true);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
     
     //classe mappane pour opérations sur panel contenant la carte
      private static class MapPane extends JPanel {
        private BufferedImage image;
        private int scale = 1;
     
      //constructeur avec BufferedImage
        public MapPane(BufferedImage image) {
          super();
          setImage(image);
        }
     
        // Recalculer correctement la taille du panel.    
        private void recalculateAndResetSize() {
          int width = 0;
          int height = 0;
          // Tenir compte de la bordure optionnelle du panel.
          Insets insets = getInsets();
          width += insets.left + insets.right;
          height += insets.top + insets.bottom;
          // Tenir compte de la taille de l'image.
          if (image != null) {
            width += image.getWidth() * scale;
            height += image.getHeight() * scale;
          }
          Dimension size = new Dimension(width, height);
          setSize(size);
          setMinimumSize(size);
          setPreferredSize(size);
        }
     
     //initialise image
        public void setImage(BufferedImage image) {
          this.image = image;
          recalculateAndResetSize();
          repaint();
        }
     
        //accesseur image
        public BufferedImage getImage() {
          return image;
        }
     
       //définit la valeur de l'echelle pour le zoom
        public void setScale(int value) {
          this.scale = value;
          recalculateAndResetSize();
          repaint();
        }
     
    //accésseur échelle
        public int getScale() {
          return scale;
        }
     
    //recalcul des border
         @Override public void setBorder(Border border) {
          super.setBorder(border);
          recalculateAndResetSize();
        }
     
     
     //affichage image avec option de rendering pour que malgré le zoom, l'image paraisse au mieux
         @Override protected void paintComponent(Graphics graphics) {
          super.paintComponent(graphics);
          Graphics2D g2d = (Graphics2D) graphics;
          if (image != null) {
            Insets insets = getInsets();
            Dimension size = getSize();
            int panelWidth = size.width - (insets.left + insets.right);
            int panelHeight = size.height - (insets.top + insets.bottom);
            int scaledImageWidth = image.getWidth() * scale;
            int scaledImageHeight = image.getHeight() * scale;
            int x = (panelWidth - scaledImageWidth) / 2;
            int y = (panelHeight - scaledImageHeight) / 2;
            // Pour permettre au bord optionnel d'etre dessine.
            g2d.translate(insets.left, insets.top);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
            g2d.drawImage(image, x, y, scaledImageWidth, scaledImageHeight, null);
            // Retour a l'origine du repere.
            g2d.translate( -insets.left, -insets.top);
          }
        }
      }
    }
    ma partie de déplacement plus précisement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      JPanel panel=new JPanel(new GridLayout(1,1)); 
        panel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
        panel.add(mapPane);
        add(panel, BorderLayout.CENTER);
        panel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
            	JPanel cadre = (JPanel) e.getSource();
    			cadre.setLocation(cadre.getX()+e.getX(),cadre.getY()+e.getY());
                repaint();
             }

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    Premièrement, as-tu réellement besoin d'ajouter le mapPane à un JPanel que tu ajoutes à la JFrame ? Tu pourrais mettre directement le mapPane dans la JFrame.

    Je te conseille d'ajouter le MouseMotionListener sur le MapPane, ce qui te permettra (moyennant l'ajout de méthode get/setImageBounds() ) de déterminer si le clic a été fait dans l'image.

    Plus en détails : dans la classe MapPane, tu crées un attribut de type Rectangle nommé imageBounds. Dans la méthode paint(Graphics g), tu stockes les informations dans cet attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    imageBounds.width = image.getWidth() * scale;
    imageBounds.height = image.getHeight() * scale;
    imageBounds.x = (panelWidth - scaledImageWidth) / 2;
    imageBounds.y = (panelHeight - scaledImageHeight) / 2;
    ...
    g2d.drawImage(image, imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height, this);
    Lors du clic, il suffira de vérifier en appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(imageBounds.contains(e.getX(), e.getY()))
    Note : ceci ne marchera que si le MouseMotionListener est placé directement sur le mapPane, autrement il faudra convertir les coordonnées.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    HiT
    HiT est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Par défaut
    merci de ton aide
    cela me donne le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    package manu;
     
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.awt.Rectangle;
    import java.io.*;
     
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.event.*;
     
    import javax.imageio.*;
     
    public class Map extends JFrame {
     
      //Variables d'instance
      protected MapPane mapPane;
      protected BufferedImage image;
      protected JSlider curseur = new JSlider(JSlider.VERTICAL, 1, 3, 1);
      Rectangle imageBounds=new Rectangle();
    //constructeur par défaut
      public Map() throws Exception {
        //Initialisation du JPanel
        // Lecture de l'image 
        image = ImageIO.read(new File("carteIHM.jpg"));
        //Ajout du contenu
        mapPane = new MapPane(image);
        //mapPane.setBorder(new TitledBorder("Map"));
        curseur.setMajorTickSpacing(1);
        curseur.setMinorTickSpacing(1);
        curseur.setPaintLabels(true);
        curseur.setPaintTicks(true);
        curseur.setSnapToTicks(true);
        setLayout(new BorderLayout());
        //essai sans JScrollPane********************
        //add(new JScrollPane(mapPane), BorderLayout.CENTER);
        add(mapPane, BorderLayout.CENTER); 
     
        mapPane.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
            	if(imageBounds.contains(e.getX(), e.getY())){
            	MapPane cadre = (MapPane) e.getSource();
    			cadre.setLocation(cadre.getX()+e.getX(),cadre.getY()+e.getY());
                repaint();}
             }
          }); 
        //essai********************************
        add(curseur, BorderLayout.EAST);
    //  événement curseur
        curseur.addChangeListener(new ChangeListener() {
        	 public void stateChanged(ChangeEvent e) {
        		 JSlider curseur = (JSlider) e.getSource();
        		 int scale = curseur.getValue();
        		 mapPane.setScale(scale);
        		 repaint();
        	 	}
        	});
     
      	}
     
    //fonction main qui se contente de créer une new map
      public static void main(String[] args) {
        try {
          Map map = new Map();
          map.setSize(750, 600);
          map.setTitle("Carte à moutons");
          map.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          map.setVisible(true);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
     
     //classe mappane pour opérations sur panel contenant la carte
      private static class MapPane extends JPanel {
        private BufferedImage image;
        private int scale = 1;
     
      //constructeur avec BufferedImage
        public MapPane(BufferedImage image) {
          super();
          setImage(image);
        }
     
        // Recalculer correctement la taille du panel.    
        private void recalculateAndResetSize() {
          int width = 0;
          int height = 0;
          // Tenir compte de la bordure optionnelle du panel.
          Insets insets = getInsets();
          width += insets.left + insets.right;
          height += insets.top + insets.bottom;
          // Tenir compte de la taille de l'image.
          if (image != null) {
            width += image.getWidth() * scale;
            height += image.getHeight() * scale;
          }
          Dimension size = new Dimension(width, height);
          setSize(size);
          setMinimumSize(size);
          setPreferredSize(size);
        }
     
     //initialise image
        public void setImage(BufferedImage image) {
          this.image = image;
          recalculateAndResetSize();
          repaint();
        }
     
        //accesseur image
        public BufferedImage getImage() {
          return image;
        }
     
       //définit la valeur de l'echelle pour le zoom
        public void setScale(int value) {
          this.scale = value;
          recalculateAndResetSize();
          repaint();
        }
     
    //accésseur échelle
        public int getScale() {
          return scale;
        }
     
    //recalcul des border
         @Override public void setBorder(Border border) {
          super.setBorder(border);
          recalculateAndResetSize();
        }
     
     
     //affichage image avec option de rendering pour que malgré le zoom, l'image paraisse au mieux
         @Override protected void paintComponent(Graphics graphics) {
          super.paintComponent(graphics);
          Graphics2D g2d = (Graphics2D) graphics;
          if (image != null) {
            Insets insets = getInsets();
            Dimension size = getSize();
            int panelWidth = size.width - (insets.left + insets.right);
            int panelHeight = size.height - (insets.top + insets.bottom);
            int scaledImageWidth = image.getWidth() * scale;
            int scaledImageHeight = image.getHeight() * scale;
            int x = (panelWidth - scaledImageWidth) / 2;
            int y = (panelHeight - scaledImageHeight) / 2;
    //      essai*************************
            int imageBoundswidth = image.getWidth() * scale;
            int imageBoundsheight = image.getHeight() * scale;
            int imageBoundsx = (panelWidth - scaledImageWidth) / 2;
            int imageBoundsy = (panelHeight - scaledImageHeight) / 2; 
            g2d.drawImage(image, imageBoundsx, imageBoundsy, imageBoundswidth, imageBoundsheight, this);
     
            //fin essai********************
            // Pour permettre au bord optionnel d'etre dessine.
            g2d.translate(insets.left, insets.top);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
            g2d.drawImage(image, x, y, scaledImageWidth, scaledImageHeight, null);
            // Retour a l'origine du repere.
            g2d.translate( -insets.left, -insets.top);
          }
        }
      }
    }
    mais au final je ne peux carrément rien déplacer :'(
    je dois etre un boulet je vois en swing

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Alors toi, tu tranformes imageBounds.x en imageBoundsx comme ça, la fleur au fusil, sans te poser de questions ?!
    (EDIT : ne le prends pas mal, je suis juste d'humeur joviale)

    Je voulais te dire de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    public class Map extends JFrame {
     
    // ici il faut enlever tout ce qui concerne 
    // imageBounds et le MouseMotionListener
    ...
     
      private static class MapPane extends JPanel {
        ...
        private Rectangle imageBounds;
     
        Rectangle getImageBounds() {
          return imageBounds;
        }
     
        public MapPane(...) {
          ...
          imageBounds = new Rectangle();
     
          addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
               if(getImageBounds().contains(e.getX(), e.getY())){
               MapPane cadre = (MapPane) e.getSource();
             cadre.setLocation(cadre.getX()+e.getX(),cadre.getY()+e.getY());
                repaint();}
             }
          }); 
        }
     
        ...
     
        public void paintComponent(Graphics graphics) {
          super.paintComponent(graphics);
          Graphics2D g2d = (Graphics2D) graphics;
          if (image != null) {
            Insets insets = getInsets();
            Dimension size = getSize();
            int panelWidth = size.width - (insets.left + insets.right);
            int panelHeight = size.height - (insets.top + insets.bottom);
     
            int imageBounds.width = image.getWidth() * scale;
            int imageBounds.height = image.getHeight() * scale;
            int imageBounds.x = (panelWidth - scaledImageWidth) / 2;
            int imageBounds.y = (panelHeight - scaledImageHeight) / 2;
     
            // Pour permettre au bord optionnel d'etre dessine.
            g2d.translate(insets.left, insets.top);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
            g2d.drawImage(image, imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height, null);
     
            // Retour a l'origine du repere.
            g2d.translate( -insets.left, -insets.top);
          }
        }
    Est-ce que tu comprends en quoi ça va marcher ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    HiT
    HiT est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Par défaut
    Alors toi, tu tranformes imageBounds.x en imageBoundsx comme ça, la fleur au fusil, sans te poser de questions ?! Scarymovie Very Happy
    (EDIT : ne le prends pas mal, je suis juste d'humeur joviale)
    au contraire je ne le prends pas mal, j'apprécie ton aide mais le problème est que en mettant le ".", eclipse me signale une erreur... ca ne lui plait pas et je ne sais pas pourquoi....
    l'erreur est syntax : error on token ".", , expected
    aurais tu une idée?peut être me manque t il une bibliothèque ou bien la version 1.5 de mon jdk ne convient pas ave ca...?
    merci

  6. #6
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Non, le problème est que tu déclares imageBounds dans Map, et que tu cherches à l'utiliser dans MapPane. C'est une erreur normale, qu'aucun compilateur ne laissera passer.

    Tu as l'air de ne pas trop aimer les classes internes. Si tu veux, tu peux déplacer la classe MapPane dans un fichier MapPane.java.

    Si tu réorganises ton code comme je t'ai indiqué, ça marchera.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    HiT
    HiT est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Par défaut
    non regarde je t'ai écouté, je l'ai déclaré dans mapPane...
    en fait c pas que j'aime pas les classes ou les classes internes mais quand ca fait moins de deux semaines que tu fais du java... c pas super simple au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.awt.Rectangle;
    import java.io.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.event.*;
    import javax.imageio.*;
    import java.awt.event.*;
    import java.awt.geom.AffineTransform;
    import java.io.IOException;
    import javax.imageio.ImageIO;
     
     
     
     
    public class Map extends JFrame {
     
      //Variables d'instance
      protected MapPane mapPane;
      protected BufferedImage image;
      protected JSlider curseur = new JSlider(JSlider.VERTICAL, 1, 3, 1);
    //constructeur par défaut
      public Map() throws Exception {
        //Initialisation du JPanel
        // Lecture de l'image
        image = ImageIO.read(new File("carteIHM.jpg"));
        //Ajout du contenu
        mapPane = new MapPane(image);
        //mapPane.setBorder(new TitledBorder("Map"));
        curseur.setMajorTickSpacing(1);
        curseur.setMinorTickSpacing(1);
        curseur.setPaintLabels(true);
        curseur.setPaintTicks(true);
        curseur.setSnapToTicks(true);
        setLayout(new BorderLayout());
        //essai sans JScrollPane********************
        //add(new JScrollPane(mapPane), BorderLayout.CENTER);
        add(mapPane, BorderLayout.CENTER);
     
     
        //essai********************************
        add(curseur, BorderLayout.EAST);
    //  événement curseur
        curseur.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
               JSlider curseur = (JSlider) e.getSource();
               int scale = curseur.getValue();
               mapPane.setScale(scale);
               repaint();
               }
           });
     
     
         }
     
    //fonction main qui se contente de créer une new map
      public static void main(String[] args) {
        try {
          Map map = new Map();
          map.setSize(750, 600);
          map.setTitle("Carte à moutons");
          map.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          map.setVisible(true);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
     
     //classe mappane pour opérations sur panel contenant la carte
      private static class MapPane extends JPanel {
        private BufferedImage image;
        private int scale = 1;
        private Rectangle imageBounds;
     
        //accesseur image de rectangle
        Rectangle getImageBounds() {
          return imageBounds;
        } 
      //constructeur avec BufferedImage
        public MapPane(BufferedImage image) {
          super();
          setImage(image);
          imageBounds = new Rectangle();
     
          addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
               if(getImageBounds().contains(e.getX(), e.getY())){
               MapPane cadre = (MapPane) e.getSource();
             cadre.setLocation(cadre.getX()+e.getX(),cadre.getY()+e.getY());
                repaint();}
             }
          }); 
        }
     
        // Recalculer correctement la taille du panel.   
        private void recalculateAndResetSize() {
          int width = 0;
          int height = 0;
          // Tenir compte de la bordure optionnelle du panel.
          Insets insets = getInsets();
          width += insets.left + insets.right;
          height += insets.top + insets.bottom;
          // Tenir compte de la taille de l'image.
          if (image != null) {
            width += image.getWidth() * scale;
            height += image.getHeight() * scale;
          }
          Dimension size = new Dimension(width, height);
          setSize(size);
          setMinimumSize(size);
          setPreferredSize(size);
        }
     
     //initialise image
        public void setImage(BufferedImage image) {
          this.image = image;
          recalculateAndResetSize();
          repaint();
        }
     
        //accesseur image
        public BufferedImage getImage() {
          return image;
        }
     
       //définit la valeur de l'echelle pour le zoom
        public void setScale(int value) {
          this.scale = value;
          recalculateAndResetSize();
          repaint();
        }
     
    //accésseur échelle
        public int getScale() {
          return scale;
        }
     
    //recalcul des border
         @Override public void setBorder(Border border) {
          super.setBorder(border);
          recalculateAndResetSize();
        }
     
     
     //affichage image avec option de rendering pour que malgré le zoom, l'image paraisse au mieux
             public void paintComponent(Graphics graphics) {
             super.paintComponent(graphics);
             Graphics2D g2d = (Graphics2D) graphics;
             if (image != null) {
               Insets insets = getInsets();
               Dimension size = getSize();
               int panelWidth = size.width - (insets.left + insets.right);
               int panelHeight = size.height - (insets.top + insets.bottom);
               int imageBounds.width = image.getWidth() * scale;
               int imageBounds.height = image.getHeight() * scale;
               int imageBounds.x = (panelWidth - scaledImageWidth) / 2;
               int imageBounds.y = (panelHeight - scaledImageHeight) / 2;
     
               // Pour permettre au bord optionnel d'etre dessine.
               //option de rendering pour un meilleur rendu de l'image lorsque celle ci est zoomé, on peut presque voir les moutons
               g2d.translate(insets.left, insets.top);
               g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
               g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
               g2d.drawImage(image, imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height, null);
     
               // Retour a l'origine du repere.
               g2d.translate( -insets.left, -insets.top);
             }
        }
      }
    }

  8. #8
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Au temps pour moi, c'est moi qui me suis trompé

    Il faut enlever les "int" devant imageBounds.machin. Voici le code de paintComponent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    		public void paintComponent(Graphics graphics) {
    			super.paintComponent(graphics);
    			Graphics2D g2d = (Graphics2D) graphics;
    			if (image != null) {
    				Insets insets = getInsets();
    				Dimension size = getSize();
    				int panelWidth = size.width - (insets.left + insets.right);
    				int panelHeight = size.height - (insets.top + insets.bottom);
     
    				int scaledImageWidth = image.getWidth() * scale;
    				int scaledImageHeight = image.getHeight() * scale;
     
    				imageBounds.width = image.getWidth() * scale;
    				imageBounds.height = image.getHeight() * scale;
    				imageBounds.x = (panelWidth - scaledImageWidth) / 2;
    				imageBounds.y = (panelHeight - scaledImageHeight) / 2;
     
    				// Pour permettre au bord optionnel d'etre dessine.
    				// option de rendering pour un meilleur rendu de l'image lorsque
    				// celle ci est zoomé, on peut presque voir les moutons
    				g2d.translate(insets.left, insets.top);
    				g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
    						RenderingHints.VALUE_RENDER_QUALITY);
    				g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    						RenderingHints.VALUE_ANTIALIAS_OFF);
    				g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    						RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
    				g2d.drawImage(image, imageBounds.x, imageBounds.y,
    						imageBounds.width, imageBounds.height, null);
     
    				// Retour a l'origine du repere.
    				g2d.translate(-insets.left, -insets.top);
    			}
    C'est ma faute, et pour un "débutant" en java, c'est du beau code.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  9. #9
    HiT
    HiT est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Par défaut
    merci ca marche
    par contre j'ai deux petits problèmes... et oui je suis un boulet
    le premier est que le drag se fait bizzarement. La carte ne se met pas forcement à l'endroit ou je mets la souris... (pas comme sur mappy quoi
    et ensuite je l'ai mise dans un JPanel, et je souhaiterais que meme si l'on dirige la carte vers un coté a l extreme elle ne puisse pas sortir completement du Jpanel... qu'on se retrouve pas sans la carte qui a disparu quoi
    sinon merci encore et dsl de t embeter autant

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    Bonjour, je souhaiterais faire quelque chose de très similaire, à peu plus complexe en réalité, qui ferait défiler la map aussi bien avec la souris que le clavier ou qu'un joystick. J'ai des connaissances de base en java, mais très peu d'experience pratique, je ne vois pas comment débuter, cela fait deja quelques jours que je m'échine. Si cous avec des conseils a me donner....

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    en tout cas les deux bouts de code ci haut mélangés ne donnent pas le resultat escompté: l'image finit par adopter des coordonnées étranges à force de la bouger....je vais regarder cela de plus près dans le code...

Discussions similaires

  1. [SDL 1.2] Affichage déplacement Images
    Par Bourg dans le forum SDL
    Réponses: 1
    Dernier message: 06/01/2015, 11h15
  2. [WD-2007] Déplacement images avec les flèches impossible
    Par riko31 dans le forum Word
    Réponses: 3
    Dernier message: 25/12/2013, 14h35
  3. Problème déplacement image avec rollOver
    Par raptor2003 dans le forum Flash
    Réponses: 2
    Dernier message: 13/06/2008, 11h57
  4. Déplacement image avec souris
    Par sabinep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/01/2008, 10h14
  5. [Image] BufferedImage : Déplacement image
    Par cyber_jad dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 08/11/2004, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo