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();
         }