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