Java Graphics2D-放大鼠标位置

我有一个要画的jpanel。我希望能够使用鼠标滚轮进行放大和缩小,但是我想缩放到鼠标的位置,以使鼠标下方的点保持不变。我找到了一些questions here on stackoverflow,但它们对我没有用。

通过实现here所描述的内容,我几乎可以完成我想做的事情。这是我的代码:

public class MyPanel extends JPanel {
...
    private double zoom = 1;
    private double zoom_old = 1;
    private int zoomPointX;
    private int zoomPointY;
...

   class CustomMouseWheelListener implements MouseWheelListener {
        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            zoomPointX = e.getX();
            zoomPointY = e.getY();
            if (e.getPreciseWheelRotation() < 0) {
                zoom -= 0.1;
            } else {
                zoom += 0.1;
            }
            if (zoom < 0.01) {
                zoom = 0.01;
            }
            repaint();
        }
    }
...
    protected void paintComponent(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;
        super.paintComponent(g2D);
        if (zoom != zoom_old) {
            double scalechange = zoom - zoom_old;
            zoom_old = zoom;
            double offsetX = -(zoomPointX * scalechange);
            double offsetY = -(zoomPointY * scalechange) ;
            AffineTransform at = new AffineTransform();
            at.scale(zoom,zoom);
            at.translate(offsetX,offsetY);
            g2D.setTransform(at);
        }
        a_different_class_where_i_do_some_drawing.draw(g2D);
    }

}

这个ALMOST可以满足我的要求。如果尝试缩放,我会注意到已考虑了鼠标的位置,因此,例如,如果将鼠标放在面板的左侧,则它将在左侧大致放大。但是,它不能完全缩放到鼠标上,因此鼠标下方的点仍会更改。

有人可以帮我解决这个问题吗?

编辑: 这是上面发布的代码所发生的情况的图片:首先,我将鼠标放在蓝色正方形上,然后使用鼠标滚轮滚动。如您所见,如果更改鼠标位置:

Java Graphics2D-放大鼠标位置

iCMS 回答:Java Graphics2D-放大鼠标位置

我通过实施here

解决了问题

这是更新的代码:

public class MyPanel extends JPanel {
...
    private double zoom = 1;
    private int zoomPointX;
    private int zoomPointY;
...

   class CustomMouseWheelListener implements MouseWheelListener {
        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            zoomPointX = e.getX();
            zoomPointY = e.getY();
            if (e.getPreciseWheelRotation() < 0) {
                zoom -= 0.1;
            } else {
                zoom += 0.1;
            }
            if (zoom < 0.01) {
                zoom = 0.01;
            }
            repaint();
        }
    }
...
    protected void paintComponent(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;
        super.paintComponent(g2D);
        AffineTransform at = g2D.getTransform();
        at.translate(zoomPointX,zoomPointY);
        at.scale(zoom,zoom);
        at.translate(-zoomPointX,-zoomPointY);
        g2D.setTransform(at);
        a_different_class_where_i_do_some_drawing.draw(g2D);
    }

}

enter image description here

本文链接:https://www.f2er.com/1682474.html

大家都在问