放大图像时,我需要计算视口的新位置。
UI的构建如下:
- ImagePanel 绘制图像
- ImagePanelWrapper 是一个包裹在 imagePanel 周围的 JPanel
- JScrollPane 包含 ImagePanelWrapper
放大或缩小时,ImagePanel 的缩放系数会发生变化,并且会重新计算 ImagePanel 的首选大小。因此,即使 ImagePanel 保持在同一视口点,此面板上的图像也会移动。
当用户按住 CTRL 并使用鼠标滚轮时,将调用以下方法。给定点是 MouseWheelListener 提供的光标位置。借助这些方法中的功能,图像在放大或缩小时已经保持在相同的左上角位置。
问题是我不知道如何相对于鼠标移动,例如 Paint.NET。有任何想法吗?
/**
*
*/
public void zoomOut(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 0.9f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 0.9f);
int newY = (int) (pos.y * 0.9f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}
/**
*
*/
public void zoomIn(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 1.1f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 1.1f);
int newY = (int) (pos.y * 1.1f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}