放大和缩小 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()));
如果您找到其他方法或认为我的方法不对,请告诉我。
谢谢
我想知道在使用面板的 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()));
如果您找到其他方法或认为我的方法不对,请告诉我。
谢谢