放大和缩小 jPanel

Zoom in and out of jPanel

我想知道在使用面板的 paintComponent 进行缩放后检索鼠标点击位置的最佳方法是什么? (相对于此缩放的位置)。

这是缩放代码:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    if(zoomer==true){    
        at.scale(zoom,zoom);//at = AffineTransform...
        zoomer=false;
    }
    g2.transform(at);

在我的主要 class 中,我使用了一个私有的鼠标侦听器 class 并覆盖了 mouseRelase 方法:

 @Override
    public void mouseReleased(MouseEvent e) 
     e.getX();//Location of the mouse on the X axis

我正在绘制不同的形状,例如点。每个点都存储了它的像素位置,因此如果在 X:20 和 Y:30 处创建它,这永远不会改变。当我调用 paintComponent 时,它会变大或变小。我的问题是,我可以点击面板上这些点的位置,它会在一些文本字段中为我提供一些关于我点击的点的信息。如果面板已缩放 in/out,则 clic 的位置仍然相同,所以假设我放大,形状不会在 x:20 和 y:30 处,而是随机的基于规模的位置。我怎样才能将我的点击位置调整到这个比例?

不确定我是否表达清楚,如果您需要更多信息,请不要犹豫。

谢谢

好吧,我已经工作了一个通宵,终于想出了如何做到这一点。

首先是滚动鼠标滚轮时发生的情况:

 @Override
    public void mouseWheelMoved(MouseWheelEvent e) {

        //Zoom in
        if(e.getWheelRotation()<0){
            mydrawer.setZoomFactor(1.1*mydrawer.getZoomFactor());
            mydrawer.repaint();
        }
        //Zoom out
        if(e.getWheelRotation()>0){
            mydrawer.setZoomFactor(mydrawer.getZoomFactor()/1.1);
            mydrawer.repaint();
        }
    }

setZoomFactor 方法执行此操作:

public void setZoomFactor(double factor){        
    if(factor<this.zoomFactor){
        this.zoomFactor=this.zoomFactor/1.1;
    }
    else{
        this.zoomFactor=factor;
    }
    this.zoomer=true;
}

之后,当我调用 repaint() 时,我将 Graphics2D 对象转换为缩放,如下所示:

 @Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    if(zoomer==true){    
        at = new AffineTransform();
        at.scale(zoomFactor,zoomFactor);
        zoomer=false;
        g2.transform(at);
    }
 }

在这一点上,没有什么新鲜事...我的问题是当我在缩放后单击绘制的对象时,我需要调整相对于缩放因子的点击位置。在我的例子中,我需要 Y 轴的 0 位于左下角而不是默认的左上角,这就是为什么我必须根据面板高度反转值:

 @Override
    public void mouseReleased(MouseEvent e) {
        int myXLocationWithoutZoom = e.getX()*(1/myDrawer.getZoomFactor());
        int myYLocationWithoutZoom = myPanel.getSize().height-((e.getY())*(1/myDrawer.getZoomFactor()));

如果您找到其他方法或认为我的方法不对,请告诉我。

谢谢