826220679@qq.com
2025-08-07 4d6cd980c5c69e4d9d150669c89734642297e0cd
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
package dell_map;  // ¶¨Òå°üÃû
import javax.swing.*;  // µ¼ÈëSwing×é¼þ
import javax.swing.event.InternalFrameEvent;  // µ¼ÈëÄÚ²¿¿ò¼Üʼþ
import javax.swing.event.InternalFrameListener;  // µ¼ÈëÄÚ²¿¿ò¼Ü¼àÌýÆ÷
import java.awt.*;  // µ¼ÈëAWT×é¼þ
import java.awt.event.*;  // µ¼ÈëAWTʼþ
import java.lang.ref.SoftReference;  // µ¼ÈëÈíÒýÓÃ
import java.util.List;  // µ¼ÈëÁбí
import java.util.ResourceBundle;  // µ¼Èë¹ú¼Ê»¯×ÊÔ´°ü
 
import targets.Mapdata;  // µ¼ÈëµØÍ¼Êý¾ÝÀà
 
public class MapViewer extends JInternalFrame implements Runnable {  // µØÍ¼²é¿´Æ÷À࣬¼Ì³ÐÄÚ²¿¿ò¼Ü²¢ÊµÏÖÏß³Ì
 
    private static final long serialVersionUID = 1L;  // ÐòÁл¯°æ±¾ID
    private MapCanvas canvas;  // µØÍ¼»­²¼
    private double scale = 1.0;  // Ëõ·Å±ÈÀý
    private int scaleStep = 200;  // Ëõ·Å²½³¤£¨Î´Ê¹Óã©
    private Point dragOrigin;  // ÍÏ×§Æðʼµã
    private int offsetX = 0;  // XÖáÆ«ÒÆÁ¿
    private int offsetY = 0;  // YÖáÆ«ÒÆÁ¿
    private int canvasWidth;  // »­²¼¿í¶È
    private int canvasHeight;  // »­²¼¸ß¶È
    private int mapWidth;  // µØÍ¼Ô­Ê¼¿í¶È
    private int mapHeight;  // µØÍ¼Ô­Ê¼¸ß¶È
    private int scaledWidth;  // Ëõ·Åºó¿í¶È
    private int scaledHeight;  // Ëõ·Åºó¸ß¶È
    private double xRatio;  // XÖáÏñËØÓëʵ¼Ê¾àÀë±ÈÀý
    private double yRatio;  // YÖáÏñËØÓëʵ¼Ê¾àÀë±ÈÀý
    private double actualWidth;  // µØÍ¼Êµ¼Ê¿í¶È£¨µ¥Î»£ºÀåÃ×£©
    private double actualHeight;  // µØÍ¼Êµ¼Ê¸ß¶È£¨µ¥Î»£ºÀåÃ×£©
    private Mapdata mapData;  // µØÍ¼Êý¾Ý¶ÔÏó
    private int originX;  // Ô­µãX×ø±ê£¨ÏñËØ£©
    private int originY;  // Ô­µãY×ø±ê£¨ÏñËØ£©
    private SoftReference<Image> mapImageRef;  // µØÍ¼Í¼ÏñµÄÈíÒýÓÃ
    private boolean isOpen = false;  // ´°¿ÚÊÇ·ñ´ò¿ª±êÖ¾
    private int sleepTime = 300;  // ÖØ»æÏß³ÌÐÝÃßʱ¼ä£¨ºÁÃ룩
    private Point mousePosition = new Point(0, 0); // ´æ´¢Êó±êλÖÃ
    private ResourceBundle messages; // ¹ú¼Ê»¯×ÊÔ´°ü
 
    public MapViewer(Mapdata mapData, ResourceBundle messages) {  // ¹¹Ô캯Êý
        super(mapData.getMapName(),   // ´°¿Ú±êÌâ
              true,  // ¿É¹Ø±Õ
              true,  // ¿É×î´ó»¯
              true,  // ¿É×îС»¯
              true); // ¿Éµ÷Õû´óС
        this.mapData = mapData;  // ³õʼ»¯µØÍ¼Êý¾Ý
        this.messages = messages;  // ³õʼ»¯×ÊÔ´°ü
        initialize();  // µ÷Óóõʼ»¯·½·¨
    }
    
    public static void createMapViewer(JDesktopPane desktopPane, String mapName, ResourceBundle messages) {  // ´´½¨µØÍ¼²é¿´Æ÷¾²Ì¬·½·¨
        // ¸ù¾ÝÃû³Æ»ñÈ¡µØÍ¼Êý¾Ý
        Mapdata mapData = Dell_Map.getMapByName(mapName);  // »ñÈ¡µØÍ¼Êý¾Ý
        if (mapData == null) {  // Èç¹ûµØÍ¼²»´æÔÚ
            String errorMsg = messages.getString("MAP_NOT_FOUND");  // »ñÈ¡´íÎóÏûÏ¢
            JOptionPane.showMessageDialog(desktopPane, errorMsg.replace("{0}", mapName),  // ÏÔʾ´íÎó¶Ô»°¿ò
                                         messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE);
            return;  // ·µ»Ø
        }
        
        MapViewer viewer = new MapViewer(mapData, messages);  // ´´½¨µØÍ¼²é¿´Æ÷ʵÀý
        viewer.setVisible(true);  // ÉèÖô°¿Ú¿É¼û
        
        // Ëæ»úÉèÖô°¿ÚλÖÃ
        int x = (int)(Math.random() * (desktopPane.getWidth() - viewer.getWidth()));  // Ëæ»úX×ø±ê
        int y = (int)(Math.random() * (desktopPane.getHeight() - viewer.getHeight()));  // Ëæ»úY×ø±ê
        viewer.setLocation(x, y);  // ÉèÖô°¿ÚλÖÃ
        
        desktopPane.add(viewer);  // Ìí¼Ó´°¿Úµ½×À̾̾°å
        viewer.toFront();  // ´°¿ÚÖö¥
    }
 
    private void initialize() {  // ³õʼ»¯·½·¨
        // ÉèÖô°¿Ú´óС
        setSize(800, 600);  // ÉèÖóõʼ´óС
        setDefaultCloseOperation(HIDE_ON_CLOSE);  // ÉèÖùرղÙ×÷ΪÒþ²Ø
        setBorder(null); // È¥µô´°Ìå±ß¿ò
        
        // ¼ÓÔØµØÍ¼Í¼Ïñ
        String mapPath = "systemfile/imagemap/" + mapData.getMapNameDetaile();  // µØÍ¼Â·¾¶
        Image image = new ImageIcon(mapPath).getImage();  // ¼ÓÔØÍ¼Ïñ
        mapImageRef = new SoftReference<>(image);  // ´´½¨ÈíÒýÓÃ
        
        // »ñÈ¡µØÍ¼³ß´ç
        mapWidth = image.getWidth(null);  // »ñȡԭʼ¿í¶È
        mapHeight = image.getHeight(null);  // »ñȡԭʼ¸ß¶È
        scaledWidth = mapWidth;  // ³õʼ»¯Ëõ·Å¿í¶È
        scaledHeight = mapHeight;  // ³õʼ»¯Ëõ·Å¸ß¶È
        
        // »ñÈ¡µØÍ¼²ÎÊý
        actualWidth = Double.parseDouble(mapData.getActualXLength());  // Êµ¼Ê¿í¶È£¨ÀåÃ×£©
        actualHeight = Double.parseDouble(mapData.getActualYLength());  // Êµ¼Ê¸ß¶È£¨ÀåÃ×£©
        originX = Integer.parseInt(mapData.getX0Coordinate());  // Ô­µãX×ø±ê
        originY = Integer.parseInt(mapData.getY0Coordinate());  // Ô­µãY×ø±ê
        
        // ¼ÆËã±ÈÀý
        xRatio = actualWidth / scaledWidth;  // ¼ÆËãXÖá±ÈÀý£¨ÀåÃ×/ÏñËØ£©
        yRatio = actualHeight / scaledHeight;  // ¼ÆËãYÖá±ÈÀý£¨ÀåÃ×/ÏñËØ£©
        
        // ÉèÖÃÄÚÈÝÃæ°å
        Container content = getContentPane();  // »ñÈ¡ÄÚÈÝÃæ°å
        content.setLayout(new BorderLayout());  // ÉèÖñ߽粼¾Ö
        content.setBackground(Color.WHITE);  // ÉèÖñ³¾°É«
        
        // ´´½¨»­²¼
        canvas = new MapCanvas();  // ÊµÀý»¯»­²¼
        content.add(canvas, BorderLayout.CENTER);  // Ìí¼Óµ½ÖÐÐÄ
        
        // ÉèÖô°¿Úͼ±ê
        setFrameIcon(new ImageIcon("image/icon/mapicon.png"));  // ÉèÖÃͼ±ê
        
        // Ìí¼Ó´°¿Úʼþ¼àÌýÆ÷
        addInternalFrameListener(new InternalFrameListener() {  // Ìí¼ÓÄÚ²¿¿ò¼Ü¼àÌýÆ÷
            @Override
            public void internalFrameOpened(InternalFrameEvent e) {  // ´°¿Ú´ò¿ªÊ±
                startThread();  // Æô¶¯ÖØ»æÏß³Ì
            }
 
            @Override
            public void internalFrameClosing(InternalFrameEvent e) {  // ´°¿Ú¹Ø±Õʱ
                isOpen = false;  // ÉèÖùرձêÖ¾
                mapImageRef.clear();  // Çå³ýͼÏñÒýÓÃ
            }
 
            @Override public void internalFrameClosed(InternalFrameEvent e) {}  // ´°¿Ú¹Ø±Õºó£¨¿ÕʵÏÖ£©
            @Override public void internalFrameIconified(InternalFrameEvent e) {  // ´°¿Ú×îС»¯Ê±
                isOpen = false;  // Í£Ö¹ÖØ»æÏß³Ì
            }
            @Override public void internalFrameDeiconified(InternalFrameEvent e) {  // ´°¿Ú»Ö¸´Ê±
                startThread();  // Æô¶¯ÖØ»æÏß³Ì
            }
            @Override public void internalFrameActivated(InternalFrameEvent e) {}  // ´°¿Ú¼¤»îʱ£¨¿ÕʵÏÖ£©
            @Override public void internalFrameDeactivated(InternalFrameEvent e) {}  // ´°¿Úʧ»îʱ£¨¿ÕʵÏÖ£©
        });
    }
 
    public void startThread() {  // Æô¶¯Ï̷߳½·¨
        if (!isOpen) {  // Èç¹ûÏß³ÌδÔËÐÐ
            isOpen = true;  // ÉèÖÃÔËÐбêÖ¾
            new Thread(this).start();  // Æô¶¯ÐÂÏß³Ì
        }
    }
 
    @Override
    public void run() {  // Ïß³ÌÔËÐз½·¨
        while (isOpen) {  // Ñ­»·Ö±µ½¹Ø±Õ
            try {
                canvas.repaint();  // Öػ滭²¼
                Thread.sleep(sleepTime);  // Ïß³ÌÐÝÃß
            } catch (InterruptedException e) {
                e.printStackTrace();  // ´òÓ¡Òì³£
            }
        }
    }
 
    /**
     * µØÍ¼»­²¼Àà
     */
    class MapCanvas extends Canvas implements MouseListener, MouseMotionListener, MouseWheelListener {  // ×Ô¶¨Òå»­²¼Àà
        
        private static final long serialVersionUID = 1L;  // ÐòÁл¯°æ±¾ID
        private Image buffer; // Ë«»º³åͼÏñ
 
        public MapCanvas() {  // ¹¹Ô캯Êý
            dragOrigin = new Point();  // ³õʼ»¯ÍÏ×§Æðµã
            addMouseListener(this);  // Ìí¼ÓÊó±ê¼àÌýÆ÷
            addMouseMotionListener(this);  // Ìí¼ÓÊó±êÒÆ¶¯¼àÌýÆ÷
            addMouseWheelListener(this);  // Ìí¼ÓÊó±ê¹öÂÖ¼àÌýÆ÷
            setBackground(Color.WHITE);  // ÉèÖñ³¾°É«
            setBorder(null); // È¥µô»­²¼±ß¿ò
        }
 
        // Ë«»º³å½â¾öÉÁ˸ÎÊÌâ
        @Override
        public void update(Graphics g) {  // ÖØÐ´updateʵÏÖË«»º³å
            if (buffer == null ||   // Èç¹û»º³åͼÏñ²»´æÔÚ
                buffer.getWidth(null) != getWidth() ||   // »ò³ß´ç²»Æ¥Åä
                buffer.getHeight(null) != getHeight()) {
                buffer = createImage(getWidth(), getHeight());  // ´´½¨Ð»º³åͼÏñ
            }
            
            if (buffer != null) {  // Èç¹û»º³åͼÏñÓÐЧ
                Graphics bg = buffer.getGraphics();  // »ñÈ¡»º³åͼÐζÔÏó
                bg.setColor(getBackground());  // ÉèÖñ³¾°É«
                bg.fillRect(0, 0, getWidth(), getHeight());  // Ìî³ä±³¾°
                paint(bg);  // ÔÚ»º³åÉÏ»æÖÆÄÚÈÝ
                g.drawImage(buffer, 0, 0, this);  // ½«»º³å»æÖƵ½ÆÁÄ»
            } else {
                super.update(g);  // µ÷Óø¸Àà·½·¨
            }
        }
 
        @Override
        public void paint(Graphics g) {  // »æÖÆ·½·¨
            super.paint(g);  // µ÷Óø¸Àà
            Graphics2D g2d = (Graphics2D) g;  // ×ª»»ÎªGraphics2D
            
            // ÉèÖÿ¹¾â³Ý
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                                RenderingHints.VALUE_ANTIALIAS_ON);  // ¿ªÆôͼÐο¹¾â³Ý
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);  // ¿ªÆôÎı¾¿¹¾â³Ý
            
            // »ñÈ¡µ±Ç°»­²¼³ß´ç
            canvasWidth = getWidth();  // »ñÈ¡»­²¼¿í¶È
            canvasHeight = getHeight();  // »ñÈ¡»­²¼¸ß¶È
            
            // »æÖƵØÍ¼
            Image mapImage = mapImageRef.get();  // »ñÈ¡µØÍ¼Í¼Ïñ
            if (mapImage != null) {  // Èç¹ûͼÏñ´æÔÚ
                g2d.drawImage(mapImage, offsetX, offsetY, scaledWidth, scaledHeight, this);  // »æÖƵØÍ¼
            }
            
            // »æÖÆ×ø±êÔ­µã
            drawOrigin(g2d);  // µ÷ÓÃÔ­µã»æÖÆ·½·¨
            
            // ÔÚÓÒϽÇÏÔʾ±ÈÀýÐÅÏ¢
            drawMapInfo(g2d);  // µ÷ÓõØÍ¼ÐÅÏ¢»æÖÆ·½·¨
            
            // ÔÚ×óϽÇÏÔʾÊó±êλÖõÄʵ¼Ê×ø±ê
            drawMouseCoordinates(g2d);  // µ÷ÓÃÊó±ê×ø±ê»æÖÆ·½·¨
        }
        
        private void drawOrigin(Graphics2D g2d) {  // »æÖÆÔ­µã·½·¨
            int originScreenX = offsetX - (int)(originX / xRatio);  // ¼ÆËãÔ­µãÆÁÄ»X×ø±ê
            int originScreenY = offsetY - (int)(originY / yRatio);  // ¼ÆËãÔ­µãÆÁÄ»Y×ø±ê
            g2d.setColor(Color.RED);  // ÉèÖúìÉ«
            g2d.fillOval(originScreenX - 5, originScreenY - 5, 10, 10);  // »æÖÆÔ­µã±ê¼Ç
            g2d.setColor(Color.BLACK);  // ÉèÖúÚÉ«
            // Ê¹ÓÃ×ÊÔ´°ü»ñȡԭµã±ê¼ÇÎı¾
            g2d.drawString(messages.getString("ORIGIN_MARK"), originScreenX + 10, originScreenY);  // »æÖÆÔ­µã±êÇ©
        }
        
        private void drawMapInfo(Graphics2D g2d) {  // »æÖƵØÍ¼ÐÅÏ¢·½·¨
            g2d.setColor(Color.BLACK);  // ÉèÖúÚÉ«
            Font font = new Font("΢ÈíÑźÚ", Font.BOLD, 14);  // ´´½¨×ÖÌå
            g2d.setFont(font);  // ÉèÖÃ×ÖÌå
            
            // Ê¹ÓÃ×ÊÔ´°ü»ñÈ¡±ÈÀýÎı¾
            String scaleText = String.format(messages.getString("SCALE_FORMAT"), scale);  // ¸ñʽ»¯±ÈÀýÎı¾
            FontMetrics fm = g2d.getFontMetrics();  // »ñÈ¡×ÖÌå¶ÈÁ¿
            int textWidth = fm.stringWidth(scaleText);  // ¼ÆËãÎı¾¿í¶È
            
            // ÔÚÓÒϽǻæÖƱÈÀýÐÅÏ¢
            int x = canvasWidth - textWidth - 20;  // ¼ÆËãX×ø±ê
            int y = canvasHeight - 20;  // ¼ÆËãY×ø±ê
            
            g2d.drawString(scaleText, x, y);  // »æÖÆÎı¾
        }
        
        private void drawMouseCoordinates(Graphics2D g2d) {  // »æÖÆÊó±ê×ø±ê·½·¨
            // ¼ÆËãÊó±êλÖõÄʵ¼Ê×ø±ê£¨ÀåÃ×£©
            double actualX = originX + (mousePosition.x - offsetX) * xRatio;  // ¼ÆËãʵ¼ÊX×ø±ê
            double actualY = originY + (mousePosition.y - offsetY) * yRatio;  // ¼ÆËãʵ¼ÊY×ø±ê
            
            g2d.setColor(Color.BLACK);  // ÉèÖúÚÉ«
            Font font = new Font("΢ÈíÑźÚ", Font.BOLD, 14);  // ´´½¨×ÖÌå
            g2d.setFont(font);  // ÉèÖÃ×ÖÌå
            
            // Ê¹ÓÃ×ÊÔ´°ü»ñÈ¡×ø±êÎı¾
            String coordText = String.format(  // ¸ñʽ»¯×ø±êÎı¾
                messages.getString("COORDINATE_FORMAT"), 
                actualX, 
                actualY
            );
            
            // ÔÚ×óϽǻæÖÆ×ø±êÐÅÏ¢
            int x = 20;  // X×ø±ê
            int y = canvasHeight - 20;  // Y×ø±ê
            
            g2d.drawString(coordText, x, y);  // »æÖÆÎı¾
        }
 
        // Êó±êʼþ´¦Àí
        @Override
        public void mousePressed(MouseEvent e) {  // Êó±ê°´ÏÂ
            dragOrigin = e.getPoint();  // ¼Ç¼ÍÏ×§Æðµã
            setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));  // ÉèÖÃÒÆ¶¯¹â±ê
        }
 
        @Override
        public void mouseDragged(MouseEvent e) {  // Êó±êÍÏ×§
            Point current = e.getPoint();  // »ñÈ¡µ±Ç°µã
            offsetX += current.x - dragOrigin.x;  // ¸üÐÂXÆ«ÒÆ
            offsetY += current.y - dragOrigin.y;  // ¸üÐÂYÆ«ÒÆ
            dragOrigin = current;  // ¸üÐÂÍÏ×§Æðµã
            repaint();  // Öػ滭²¼
        }
 
        @Override
        public void mouseReleased(MouseEvent e) {  // Êó±êÊÍ·Å
            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));  // »Ö¸´Ä¬ÈϹâ±ê
        }
        
        @Override
        public void mouseMoved(MouseEvent e) {  // Êó±êÒÆ¶¯
            // ¸üÐÂÊó±êλÖÃ
            mousePosition = e.getPoint();  // ¼Ç¼Êó±êλÖÃ
            repaint();  // Öػ滭²¼
        }
 
        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {  // Êó±ê¹öÂÖʼþ
            int rotation = e.getWheelRotation();  // »ñÈ¡¹öÂÖÐýת·½Ïò
            double zoomFactor = 1.1;  // Ëõ·ÅÒò×Ó
            
            // ¼ÆËãÊó±êµ±Ç°Î»ÖöÔÓ¦µÄµØÍ¼×ø±ê
            Point mousePos = e.getPoint();  // »ñÈ¡Êó±êλÖÃ
            double prevMapX = (mousePos.x - offsetX) * xRatio;  // ¼ÆËãÔ­µØÍ¼X×ø±ê
            double prevMapY = (mousePos.y - offsetY) * yRatio;  // ¼ÆËãÔ­µØÍ¼Y×ø±ê
            
            // µ÷ÕûËõ·Å±ÈÀý£¨ÏÞÖÆÔÚ0.2-5.0±¶Ö®¼ä£©
            if (rotation < 0 && scale < 5.0) { // ·Å´ó
                scale *= zoomFactor;  // ·Å´ó±ÈÀý
                if (scale > 5.0) {  // ÉÏÏÞ¼ì²é
                    scale = 5.0;  // ÉèÖÃ×î´óÖµ
                }
            } else if (rotation > 0 && scale > 0.2) { // ËõС
                scale /= zoomFactor;  // ËõС±ÈÀý
                if (scale < 0.2) {  // ÏÂÏÞ¼ì²é
                    scale = 0.2;  // ÉèÖÃ×îСֵ
                }
            }
            
            // Ó¦ÓÃËõ·Å
            scaledWidth = (int)(mapWidth * scale);  // ¼ÆËãпí¶È
            scaledHeight = (int)(mapHeight * scale);  // ¼ÆËãи߶È
            
            // ¸üбÈÀý
            xRatio = actualWidth / scaledWidth;  // ¸üÐÂX±ÈÀý
            yRatio = actualHeight / scaledHeight;  // ¸üÐÂY±ÈÀý
            
            // ¼ÆËãËõ·ÅºóµÄÆ«ÒÆÁ¿£¬Ê¹Êó±êλÖöÔÓ¦µÄµØÍ¼Î»Öñ£³Ö²»±ä
            double newMapX = prevMapX / xRatio;  // ¼ÆËãÐÂÆÁÄ»X×ø±ê
            double newMapY = prevMapY / yRatio;  // ¼ÆËãÐÂÆÁÄ»Y×ø±ê
            offsetX = (int)(mousePos.x - newMapX);  // ¸üÐÂXÆ«ÒÆ
            offsetY = (int)(mousePos.y - newMapY);  // ¸üÐÂYÆ«ÒÆ
            
            repaint();  // Öػ滭²¼
        }
 
        // ÆäËûÊó±êʼþ£¨¿ÕʵÏÖ£©
        @Override public void mouseClicked(MouseEvent e) {}  // Êó±êµã»÷
        @Override public void mouseEntered(MouseEvent e) {}  // Êó±ê½øÈë
        @Override public void mouseExited(MouseEvent e) {}  // Êó±êÀ뿪
    }
 
    /**
     * ´´½¨ËùÓеØÍ¼µÄ´°¿Ú
     */
    public static void createAllMapViewers(JDesktopPane desktopPane, ResourceBundle messages) {  // ´´½¨ËùÓеØÍ¼´°¿Ú
        List<Mapdata> allMaps = Dell_Map.getAllMaps();  // »ñÈ¡ËùÓеØÍ¼Êý¾Ý
        for (Mapdata map : allMaps) {  // ±éÀúµØÍ¼
            MapViewer viewer = new MapViewer(map, messages);  // ´´½¨²é¿´Æ÷
            viewer.setVisible(true);  // ÉèÖÿɼû
            
            // Ëæ»úÉèÖô°¿ÚλÖÃ
            int x = (int)(Math.random() * (desktopPane.getWidth() - viewer.getWidth()));  // Ëæ»úX
            int y = (int)(Math.random() * (desktopPane.getHeight() - viewer.getHeight()));  // Ëæ»úY
            viewer.setLocation(x, y);  // ÉèÖÃλÖÃ
            
            desktopPane.add(viewer);  // Ìí¼Óµ½×ÀÃæ
            viewer.toFront();  // Öö¥
        }
    }
}