Add zoom controls to basic drawing.
This commit is contained in:
parent
7827bfc63c
commit
dede97bc68
5 changed files with 354 additions and 108 deletions
|
@ -5,12 +5,16 @@ import java.awt.Color;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
import java.awt.geom.NoninvertibleTransformException;
|
import java.awt.geom.NoninvertibleTransformException;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
|
@ -286,17 +290,42 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||||
// Mapping DrawingClickListener -> MouseEventListener
|
// Mapping DrawingClickListener -> MouseEventListener
|
||||||
private Map<DrawingClickListener, MouseListener> listenerMapping = new IdentityHashMap<>();
|
private Map<DrawingClickListener, MouseListener> listenerMapping = new IdentityHashMap<>();
|
||||||
|
|
||||||
|
// Zoom controls
|
||||||
|
private MapZoomControls zoomControls;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BasicDrawing.
|
* Create a new BasicDrawing.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public BasicDrawing() {
|
public BasicDrawing() {
|
||||||
this.zoomAndPanListener = new ZoomAndPanListener(this, ZoomAndPanListener.DEFAULT_MIN_ZOOM_LEVEL, 20, 1.2);
|
this.zoomAndPanListener = new ZoomAndPanListener(this, ZoomAndPanListener.DEFAULT_MIN_ZOOM_LEVEL, 20, 1.2);
|
||||||
|
|
||||||
|
// Try...
|
||||||
|
try {
|
||||||
|
this.zoomControls = new MapZoomControls(this, 0, ZoomAndPanListener.DEFAULT_MIN_ZOOM_LEVEL, 20);
|
||||||
|
this.zoomControls.addZoomInListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
zoomAndPanListener.zoomIn();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.zoomControls.addZoomOutListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
zoomAndPanListener.zoomOut();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paintComponent(Graphics g1) {
|
public void paintComponent(Graphics g1) {
|
||||||
|
super.paintComponent(g1);
|
||||||
Graphics2D g = (Graphics2D) g1;
|
Graphics2D g = (Graphics2D) g1;
|
||||||
|
AffineTransform sTransform = g.getTransform();
|
||||||
g.clearRect(0, 0, getWidth(), getHeight());
|
g.clearRect(0, 0, getWidth(), getHeight());
|
||||||
g.setTransform(zoomAndPanListener.getCoordTransform());
|
g.setTransform(zoomAndPanListener.getCoordTransform());
|
||||||
|
|
||||||
|
@ -311,6 +340,14 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||||
overlay.draw(g);
|
overlay.draw(g);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.setTransform(sTransform);
|
||||||
|
if (this.zoomControls != null) {
|
||||||
|
this.zoomControls.setZoomLevel(this.zoomAndPanListener.getZoomLevel());
|
||||||
|
this.zoomControls.draw(g, getWidth() - this.zoomControls.getWidth() - 20,
|
||||||
|
this.getHeight() - this.zoomControls.getHeight() - 20, this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -513,6 +550,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||||
(this.getHeight() - this.height * scale) / 2);
|
(this.getHeight() - this.height * scale) / 2);
|
||||||
this.zoomAndPanListener.getCoordTransform().scale(scale, scale);
|
this.zoomAndPanListener.getCoordTransform().scale(scale, scale);
|
||||||
this.zoomAndPanListener.setZoomLevel(0);
|
this.zoomAndPanListener.setZoomLevel(0);
|
||||||
|
this.zoomControls.setZoomLevel(0);
|
||||||
|
|
||||||
// Repaint
|
// Repaint
|
||||||
this.repaint();
|
this.repaint();
|
||||||
|
|
|
@ -0,0 +1,173 @@
|
||||||
|
package org.insa.graphics.drawing.components;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.image.ImageObserver;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
public class MapZoomControls {
|
||||||
|
|
||||||
|
// Default ID for action events
|
||||||
|
private static final int ZOOM_IN_ACTION_ID = 0x1;
|
||||||
|
private static final String ZOOM_IN_ACTION_NAME = "ZoomIn";
|
||||||
|
|
||||||
|
private static final int ZOOM_OUT_ACTION_ID = 0x2;
|
||||||
|
private static final String ZOOM_OUT_ACTION_NAME = "ZoomOut";
|
||||||
|
|
||||||
|
// Height
|
||||||
|
private static final int DEFAULT_HEIGHT = 18;
|
||||||
|
|
||||||
|
// Default spacing between mark
|
||||||
|
private static final int DEFAULT_SPACING = 3;
|
||||||
|
|
||||||
|
// Zoom ticks ratio from height (not the current one)
|
||||||
|
private static final double ZOOM_TICK_HEIGHT_RATIO = 0.3;
|
||||||
|
|
||||||
|
// Zoom ticks color
|
||||||
|
private static final Color ZOOM_TICK_COLOR = Color.GRAY;
|
||||||
|
|
||||||
|
// Current zoom ticks ratio from height
|
||||||
|
private static final double CURRENT_ZOOM_TICK_HEIGHT_RATIO = 0.8;
|
||||||
|
|
||||||
|
// Zoom ticks color
|
||||||
|
private static final Color CURRENT_ZOOM_TICK_COLOR = new Color(25, 25, 25);
|
||||||
|
|
||||||
|
// Use half mark or not
|
||||||
|
private boolean halfMark = true;
|
||||||
|
|
||||||
|
private int currentLevel = 0;
|
||||||
|
private final int minLevel, maxLevel;
|
||||||
|
|
||||||
|
// Zoom in/out image and their rectangles.
|
||||||
|
private final Image zoomIn, zoomOut;
|
||||||
|
private final Rectangle zoomInRect = new Rectangle(0, 0, 0, 0), zoomOutRect = new Rectangle(0, 0, 0, 0);
|
||||||
|
|
||||||
|
// List of listeners
|
||||||
|
private final List<ActionListener> zoomInListeners = new ArrayList<>();
|
||||||
|
private final List<ActionListener> zoomOutListeners = new ArrayList<>();
|
||||||
|
|
||||||
|
public MapZoomControls(Component component, final int defaultZoom, final int minZoom, final int maxZoom)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
|
zoomIn = ImageIO.read(new File("zoomIn.png")).getScaledInstance(DEFAULT_HEIGHT, DEFAULT_HEIGHT,
|
||||||
|
Image.SCALE_SMOOTH);
|
||||||
|
zoomOut = ImageIO.read(new File("zoomOut.png")).getScaledInstance(DEFAULT_HEIGHT, DEFAULT_HEIGHT,
|
||||||
|
Image.SCALE_SMOOTH);
|
||||||
|
|
||||||
|
this.currentLevel = defaultZoom;
|
||||||
|
this.minLevel = minZoom;
|
||||||
|
this.maxLevel = maxZoom;
|
||||||
|
|
||||||
|
component.addMouseListener(new MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(MouseEvent e) {
|
||||||
|
if (zoomInRect.contains(e.getPoint()) && currentLevel < maxLevel) {
|
||||||
|
currentLevel += 1;
|
||||||
|
for (ActionListener al: zoomInListeners) {
|
||||||
|
al.actionPerformed(new ActionEvent(this, ZOOM_IN_ACTION_ID, ZOOM_IN_ACTION_NAME));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (zoomOutRect.contains(e.getPoint()) && currentLevel > minLevel) {
|
||||||
|
currentLevel -= 1;
|
||||||
|
for (ActionListener al: zoomOutListeners) {
|
||||||
|
al.actionPerformed(new ActionEvent(this, ZOOM_OUT_ACTION_ID, ZOOM_OUT_ACTION_NAME));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
component.repaint();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a zoom-in listener.
|
||||||
|
*
|
||||||
|
* @param listener
|
||||||
|
*/
|
||||||
|
public void addZoomInListener(ActionListener listener) {
|
||||||
|
this.zoomInListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a zoom-out listener.
|
||||||
|
*
|
||||||
|
* @param listener
|
||||||
|
*/
|
||||||
|
public void addZoomOutListener(ActionListener listener) {
|
||||||
|
this.zoomOutListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the current zoom level.
|
||||||
|
*/
|
||||||
|
public int getZoomLevel() {
|
||||||
|
return this.currentLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the current zoom level.
|
||||||
|
*
|
||||||
|
* @param level
|
||||||
|
*/
|
||||||
|
public void setZoomLevel(int level) {
|
||||||
|
this.currentLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Height of this "component" when drawn.
|
||||||
|
*/
|
||||||
|
public int getHeight() {
|
||||||
|
return DEFAULT_HEIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Width of this "component" when drawn.
|
||||||
|
*/
|
||||||
|
public int getWidth() {
|
||||||
|
return DEFAULT_HEIGHT + 2 + (this.maxLevel - this.minLevel) * DEFAULT_SPACING + 1 + 2 + DEFAULT_HEIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void draw(Graphics2D g, int xoffset, int yoffset, ImageObserver observer) {
|
||||||
|
|
||||||
|
int height = getHeight();
|
||||||
|
|
||||||
|
// Draw icon
|
||||||
|
g.drawImage(zoomOut, xoffset, yoffset, observer);
|
||||||
|
zoomOutRect.setBounds(xoffset, yoffset, DEFAULT_HEIGHT, DEFAULT_HEIGHT);
|
||||||
|
|
||||||
|
// Draw ticks
|
||||||
|
xoffset += DEFAULT_HEIGHT + 2;
|
||||||
|
g.setColor(ZOOM_TICK_COLOR);
|
||||||
|
g.drawLine(xoffset, yoffset + height / 2, xoffset + (this.maxLevel - this.minLevel) * DEFAULT_SPACING + 1,
|
||||||
|
yoffset + height / 2);
|
||||||
|
for (int i = 0; i <= (this.maxLevel - this.minLevel); i += halfMark ? 2 : 1) {
|
||||||
|
g.drawLine(xoffset + i * DEFAULT_SPACING, yoffset + (int) (height * (1 - ZOOM_TICK_HEIGHT_RATIO) / 2),
|
||||||
|
xoffset + i * DEFAULT_SPACING, yoffset + (int) (height * (1 + ZOOM_TICK_HEIGHT_RATIO) / 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw current ticks
|
||||||
|
g.setColor(CURRENT_ZOOM_TICK_COLOR);
|
||||||
|
g.drawLine(xoffset + (currentLevel - this.minLevel) * DEFAULT_SPACING,
|
||||||
|
yoffset + (int) (height * (1 - CURRENT_ZOOM_TICK_HEIGHT_RATIO) / 2),
|
||||||
|
xoffset + (currentLevel - this.minLevel) * DEFAULT_SPACING,
|
||||||
|
yoffset + (int) (height * (1 + CURRENT_ZOOM_TICK_HEIGHT_RATIO) / 2));
|
||||||
|
|
||||||
|
xoffset += (this.maxLevel - this.minLevel) * DEFAULT_SPACING + 1 + 2;
|
||||||
|
|
||||||
|
g.drawImage(zoomIn, xoffset, yoffset, observer);
|
||||||
|
zoomInRect.setBounds(xoffset, yoffset, DEFAULT_HEIGHT, DEFAULT_HEIGHT);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,141 +1,176 @@
|
||||||
package org.insa.graphics.drawing.components;
|
package org.insa.graphics.drawing.components;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.Component;
|
||||||
import java.awt.event.*;
|
import java.awt.Point;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.MouseListener;
|
||||||
|
import java.awt.event.MouseMotionListener;
|
||||||
|
import java.awt.event.MouseWheelEvent;
|
||||||
|
import java.awt.event.MouseWheelListener;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
import java.awt.geom.NoninvertibleTransformException;
|
import java.awt.geom.NoninvertibleTransformException;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
|
|
||||||
public class ZoomAndPanListener implements MouseListener, MouseMotionListener, MouseWheelListener {
|
public class ZoomAndPanListener implements MouseListener, MouseMotionListener, MouseWheelListener {
|
||||||
public static final int DEFAULT_MIN_ZOOM_LEVEL = -20;
|
public static final int DEFAULT_MIN_ZOOM_LEVEL = -20;
|
||||||
public static final int DEFAULT_MAX_ZOOM_LEVEL = 10;
|
public static final int DEFAULT_MAX_ZOOM_LEVEL = 10;
|
||||||
public static final double DEFAULT_ZOOM_MULTIPLICATION_FACTOR = 1.2;
|
public static final double DEFAULT_ZOOM_MULTIPLICATION_FACTOR = 1.2;
|
||||||
|
|
||||||
private Component targetComponent;
|
private Component targetComponent;
|
||||||
|
|
||||||
private int zoomLevel = 0;
|
private int zoomLevel = 0;
|
||||||
private int minZoomLevel = DEFAULT_MIN_ZOOM_LEVEL;
|
private int minZoomLevel = DEFAULT_MIN_ZOOM_LEVEL;
|
||||||
private int maxZoomLevel = DEFAULT_MAX_ZOOM_LEVEL;
|
private int maxZoomLevel = DEFAULT_MAX_ZOOM_LEVEL;
|
||||||
private double zoomMultiplicationFactor = DEFAULT_ZOOM_MULTIPLICATION_FACTOR;
|
private double zoomMultiplicationFactor = DEFAULT_ZOOM_MULTIPLICATION_FACTOR;
|
||||||
|
|
||||||
private Point dragStartScreen;
|
private Point dragStartScreen;
|
||||||
private Point dragEndScreen;
|
private Point dragEndScreen;
|
||||||
private AffineTransform coordTransform = new AffineTransform();
|
private AffineTransform coordTransform = new AffineTransform();
|
||||||
|
|
||||||
public ZoomAndPanListener(Component targetComponent) {
|
public ZoomAndPanListener(Component targetComponent) {
|
||||||
this.targetComponent = targetComponent;
|
this.targetComponent = targetComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZoomAndPanListener(Component targetComponent, int minZoomLevel, int maxZoomLevel, double zoomMultiplicationFactor) {
|
public ZoomAndPanListener(Component targetComponent, int minZoomLevel, int maxZoomLevel,
|
||||||
this.targetComponent = targetComponent;
|
double zoomMultiplicationFactor) {
|
||||||
this.minZoomLevel = minZoomLevel;
|
this.targetComponent = targetComponent;
|
||||||
this.maxZoomLevel = maxZoomLevel;
|
this.minZoomLevel = minZoomLevel;
|
||||||
this.zoomMultiplicationFactor = zoomMultiplicationFactor;
|
this.maxZoomLevel = maxZoomLevel;
|
||||||
}
|
this.zoomMultiplicationFactor = zoomMultiplicationFactor;
|
||||||
|
}
|
||||||
public void translate(double dx, double dy) {
|
|
||||||
coordTransform.translate(dx, dy);
|
|
||||||
targetComponent.repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public void translate(double dx, double dy) {
|
||||||
|
coordTransform.translate(dx, dy);
|
||||||
|
targetComponent.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mousePressed(MouseEvent e) {
|
public void mousePressed(MouseEvent e) {
|
||||||
dragStartScreen = e.getPoint();
|
dragStartScreen = e.getPoint();
|
||||||
dragEndScreen = null;
|
dragEndScreen = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseReleased(MouseEvent e) {
|
public void mouseReleased(MouseEvent e) {
|
||||||
// moveCamera(e);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseEntered(MouseEvent e) {
|
public void mouseEntered(MouseEvent e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseExited(MouseEvent e) {
|
public void mouseExited(MouseEvent e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseMoved(MouseEvent e) {
|
public void mouseMoved(MouseEvent e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseDragged(MouseEvent e) {
|
public void mouseDragged(MouseEvent e) {
|
||||||
moveCamera(e);
|
moveCamera(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseWheelMoved(MouseWheelEvent e) {
|
public void mouseWheelMoved(MouseWheelEvent e) {
|
||||||
zoomCamera(e);
|
zoomCamera(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void moveCamera(MouseEvent e) {
|
private void moveCamera(MouseEvent e) {
|
||||||
try {
|
try {
|
||||||
dragEndScreen = e.getPoint();
|
dragEndScreen = e.getPoint();
|
||||||
Point2D.Float dragStart = transformPoint(dragStartScreen);
|
Point2D.Float dragStart = transformPoint(dragStartScreen);
|
||||||
Point2D.Float dragEnd = transformPoint(dragEndScreen);
|
Point2D.Float dragEnd = transformPoint(dragEndScreen);
|
||||||
double dx = dragEnd.getX() - dragStart.getX();
|
double dx = dragEnd.getX() - dragStart.getX();
|
||||||
double dy = dragEnd.getY() - dragStart.getY();
|
double dy = dragEnd.getY() - dragStart.getY();
|
||||||
coordTransform.translate(dx, dy);
|
coordTransform.translate(dx, dy);
|
||||||
dragStartScreen = dragEndScreen;
|
dragStartScreen = dragEndScreen;
|
||||||
dragEndScreen = null;
|
dragEndScreen = null;
|
||||||
targetComponent.repaint();
|
targetComponent.repaint();
|
||||||
} catch (NoninvertibleTransformException ex) {
|
}
|
||||||
ex.printStackTrace();
|
catch (NoninvertibleTransformException ex) {
|
||||||
}
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void zoomCamera(MouseWheelEvent e) {
|
private void zoomCamera(MouseWheelEvent e) {
|
||||||
try {
|
try {
|
||||||
int wheelRotation = e.getWheelRotation();
|
int wheelRotation = e.getWheelRotation();
|
||||||
Point p = e.getPoint();
|
Point p = e.getPoint();
|
||||||
if (wheelRotation > 0) {
|
if (wheelRotation < 0) {
|
||||||
if (zoomLevel < maxZoomLevel) {
|
if (zoomLevel < maxZoomLevel) {
|
||||||
zoomLevel++;
|
zoomLevel++;
|
||||||
Point2D p1 = transformPoint(p);
|
Point2D p1 = transformPoint(p);
|
||||||
coordTransform.scale(1 / zoomMultiplicationFactor, 1 / zoomMultiplicationFactor);
|
coordTransform.scale(zoomMultiplicationFactor, zoomMultiplicationFactor);
|
||||||
Point2D p2 = transformPoint(p);
|
Point2D p2 = transformPoint(p);
|
||||||
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
||||||
targetComponent.repaint();
|
targetComponent.repaint();
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if (zoomLevel > minZoomLevel) {
|
else {
|
||||||
zoomLevel--;
|
if (zoomLevel > minZoomLevel) {
|
||||||
Point2D p1 = transformPoint(p);
|
zoomLevel--;
|
||||||
coordTransform.scale(zoomMultiplicationFactor, zoomMultiplicationFactor);
|
Point2D p1 = transformPoint(p);
|
||||||
Point2D p2 = transformPoint(p);
|
coordTransform.scale(1 / zoomMultiplicationFactor, 1 / zoomMultiplicationFactor);
|
||||||
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
Point2D p2 = transformPoint(p);
|
||||||
targetComponent.repaint();
|
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
||||||
}
|
targetComponent.repaint();
|
||||||
}
|
}
|
||||||
} catch (NoninvertibleTransformException ex) {
|
}
|
||||||
ex.printStackTrace();
|
}
|
||||||
}
|
catch (NoninvertibleTransformException ex) {
|
||||||
}
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Point2D.Float transformPoint(Point p1) throws NoninvertibleTransformException {
|
private Point2D.Float transformPoint(Point p1) throws NoninvertibleTransformException {
|
||||||
|
|
||||||
AffineTransform inverse = coordTransform.createInverse();
|
AffineTransform inverse = coordTransform.createInverse();
|
||||||
|
|
||||||
Point2D.Float p2 = new Point2D.Float();
|
Point2D.Float p2 = new Point2D.Float();
|
||||||
inverse.transform(p1, p2);
|
inverse.transform(p1, p2);
|
||||||
return p2;
|
return p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getZoomLevel() {
|
public int getZoomLevel() {
|
||||||
return zoomLevel;
|
return zoomLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setZoomLevel(int zoomLevel) {
|
||||||
|
this.zoomLevel = zoomLevel;
|
||||||
|
}
|
||||||
|
|
||||||
public void setZoomLevel(int zoomLevel) {
|
public void zoomIn() {
|
||||||
this.zoomLevel = zoomLevel;
|
try {
|
||||||
}
|
Point p = new Point(targetComponent.getWidth() / 2, targetComponent.getHeight() / 2);
|
||||||
|
zoomLevel++;
|
||||||
|
Point2D p1 = transformPoint(p);
|
||||||
|
coordTransform.scale(zoomMultiplicationFactor, zoomMultiplicationFactor);
|
||||||
|
Point2D p2 = transformPoint(p);
|
||||||
|
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
||||||
|
targetComponent.repaint();
|
||||||
|
}
|
||||||
|
catch (NoninvertibleTransformException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void zoomOut() {
|
||||||
|
try {
|
||||||
|
Point p = new Point(targetComponent.getWidth() / 2, targetComponent.getHeight() / 2);
|
||||||
|
zoomLevel--;
|
||||||
|
Point2D p1 = transformPoint(p);
|
||||||
|
coordTransform.scale(1 / zoomMultiplicationFactor, 1 / zoomMultiplicationFactor);
|
||||||
|
Point2D p2 = transformPoint(p);
|
||||||
|
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
||||||
|
targetComponent.repaint();
|
||||||
|
}
|
||||||
|
catch (NoninvertibleTransformException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public AffineTransform getCoordTransform() {
|
public AffineTransform getCoordTransform() {
|
||||||
return coordTransform;
|
return coordTransform;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCoordTransform(AffineTransform coordTransform) {
|
public void setCoordTransform(AffineTransform coordTransform) {
|
||||||
this.coordTransform = coordTransform;
|
this.coordTransform = coordTransform;
|
||||||
}
|
}
|
||||||
}
|
}
|
BIN
zoomIn.png
Normal file
BIN
zoomIn.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
BIN
zoomOut.png
Normal file
BIN
zoomOut.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
Loading…
Reference in a new issue