放大和缩小jPanel

时间:2015-11-25 20:30:03

标签: java jpanel zoom paintcomponent affinetransform

我想知道在使用面板的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);

在我的主类中,我使用鼠标侦听器私有类并覆盖mouseRelase方法:

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

我正在绘制不同的形状,如点。每个点都有它存储的像素位置,所以如果在X:20和Y:30创建它,它永远不会改变。当我调用paintComponent时,它会被放大或缩小。我的问题是,我可以在面板上找到这些点的位置,它在一些textFields中给出了一些关于我点击的点的信息。如果面板已放大/缩小,则clic的位置仍然相同,所以让我说放大,形状不会在x:20和y:30但是随机基于规模的位置。我怎样才能将我的clic位置调整到这个范围?

不确定我是否明确了myselft,所以如果您需要更多信息,请不要犹豫。

谢谢

1 个答案:

答案 0 :(得分:5)

好吧,我整夜都在工作,最后想出了怎么做。

首先,我滚动鼠标滚轮时会发生什么:

 @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);
    }
 }

此时,没有什么新东西......我的问题是当我在缩放后点击绘制的对象时,我需要调整相对于缩放系数的clic位置。在我的情况下,我需要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()));

如果您想出另一种方法,或者认为我没有这样做,请告诉我。

谢谢