【问题标题】:Java Graphics2D - Zoom on mouse locationJava Graphics2D - 放大鼠标位置
【发布时间】:2020-08-25 16:50:04
【问题描述】:

我有一个 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);
    }

}

这几乎可以满足我的要求。如果我尝试缩放,我注意到鼠标的位置被考虑在内,例如,如果我将鼠标放在面板的左侧,它会在左侧大致放大。但是,它并没有完全缩放到鼠标上,所以鼠标下的点仍然会改变。

谁能帮我解决这个问题?

编辑: 这是上面发布的代码所发生的情况的图片:我从蓝色方块上的鼠标开始,然后用鼠标滚轮滚动。如您所见,如果更改了鼠标位置:

【问题讨论】:

    标签: java swing zooming graphics2d


    【解决方案1】:

    我通过实现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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2011-05-03
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多