Bonjour,

Mon but est ici d'ouvrir une fenetre contenant une image de tres grande taille genre (2000 x 2000 et de 10 MO), de pouvoir la bouger pas drag and drop avec la souris, avec les fleches du clavier, et de pouvoir zoomer dessus à l'aide de la molette. Ce dernier point n'est pas encore pret, il n'y a qu'un curseur zomm a droite pour le moment.

j'ai créer un code à partir de plusieurs autres, mais plusieurs problèmes sont apparus:
impossible de lire l'image il me fait une erreur de memoire, il em faut lancer l'appli sous dos grace a la commande:
java -Xms128m -Xmx512m Package3.MainFrameInternet
afin d'allouer davantage de memoire.
Q1: comment pouvoir lancer cela sous netbeans?

on s'appercoit en la deplacant que l'image est coupée, on tombe donc tres vite sur des zones blanches au lieu d'afficher la partie de l'image qui etait initialement en dehors de la fenetre.
Q2: comment y remedier?

Q3:J'ai dû mal codé la partie clavier: au lieu de déplacer l'image, je zoom ! :-S

Q4: quand j'arrive à une extremité de l'image droite ou gauche de l'écran je voudrais revenir de l'autre coté: comme ci on avait un bandeau de 360° dans lequel on peut tourner à l'infini, j'ai tenté mais sans succès. Et bloquer quand on arrive a la limite supérieur ou inférieur de l'image...
Si quelqu'un peut m'aider...merci


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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
 
import javax.imageio.ImageIO;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
public class MainFrameInternet extends JFrame {
 
    // public class Mainpanel extends JFrame {
 
    // Variables d'instance
    protected BufferedImage image;
    protected JSlider curseur = new JSlider(JSlider.VERTICAL, 1, 3, 1);
    protected Panel SimConfigurationPane;
    protected Panel SimPanonnierPane;
    protected Panel SimNexterPane;
    protected Panel SimPostePane;
    protected MapPane EeVeillePane;
    protected Panel EeHbPane;
    protected Panel EeGdPane;
    protected Panel EeArmPane;
    protected Panel EePanoPane;
 
    // constructor by default
    public MainFrameInternet() throws Exception {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(0, 0, 1280, 1024);
 
        // read pic
        image = ImageIO.read(new File("Images/tree.jpg"));
        // Add inside
        EeVeillePane = 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());
        add(EeVeillePane, BorderLayout.CENTER);
        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();
                EeVeillePane.setScale(scale);
                repaint();
                MainFrameInternet.this.validate();
            }
        });
 
    }
 
    /*
     * fonction main qui se contente de créer une new map public static void
     * main(String[] args) {
     *
     * }
     */
 
    // 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;
        private int xClick = 0;
        private int yClick = 0;
 
 
        // 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() - xClick, cadre.getY() + e.getY() - yClick);
                        repaint();
                    }
                }
            });
 
            addMouseListener(new MouseAdapter() {
 
                @Override
                public void mousePressed(MouseEvent e) {
                    xClick = e.getX();
                    yClick = e.getY();
                }
            });
 
            addKeyListener(new KeyAdapter() {
 
                public void keyTyped(KeyEvent evt) {
                    int key = evt.getKeyCode();
                    int dx = 10;
                    int dy = 5;
                    int x=0;
                    int y=0;
                    switch (key) {
                        case KeyEvent.VK_UP:
                            y -= dy;
                            break;
                        case KeyEvent.VK_DOWN:
                            y += dy;
                            break;
                        case KeyEvent.VK_RIGHT:
                            x += dx;
                            break;
                        case KeyEvent.VK_LEFT:
                            x -= dx;
                        default:
                            break;
                    }
                    MapPane cadre = (MapPane) evt.getSource();
                    cadre.setLocation(cadre.getX()  - x, cadre.getY()  - y);
                    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 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;
                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);
            }
        }
    }
 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
 
        setName("Form"); // NOI18N
 
        GroupLayout layout = new GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE));
        layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 300, Short.MAX_VALUE));
    }// </editor-fold>
 
    public static void main(String[] args) throws Exception {
        (new MainFrameInternet()).setVisible(true);
    }
 
    // Variables declaration - do not modify
    // End of variables declaration
}