Fid*_*sto 2 java zoom jpanel affinetransform paintcomponent
我想知道在使用面板的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);
Run Code Online (Sandbox Code Playgroud)
在我的主类中,我使用鼠标侦听器私有类并覆盖mouseRelase方法:
@Override
public void mouseReleased(MouseEvent e)
e.getX();//Location of the mouse on the X axis
Run Code Online (Sandbox Code Playgroud)
我正在绘制不同的形状,如点.每个点都有它的像素位置存储,所以如果在X:20和Y:30创建它,这永远不会改变.当我调用paintComponent时,它会被放大或缩小.我的问题是,我可以在面板上找到这些点的位置,它在一些textFields中给出了一些关于我点击的点的信息.如果面板已放大/缩小,则clic的位置仍然相同,所以假设我放大,形状不会在x:20和y:30,而是在基于比例的随机位置.我怎样才能将我的clic位置调整到这个比例?
不确定我是否明确了myselft,所以如果您需要更多信息,请不要犹豫.
谢谢
好吧,我整夜都在工作,最后想出怎么做.
首先,我滚动鼠标滚轮时会发生什么:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
setZoomFactor方法执行此操作:
public void setZoomFactor(double factor){
if(factor<this.zoomFactor){
this.zoomFactor=this.zoomFactor/1.1;
}
else{
this.zoomFactor=factor;
}
this.zoomer=true;
}
Run Code Online (Sandbox Code Playgroud)
之后,当我调用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);
}
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,没有什么新的......我的问题是当我在缩放后点击绘制的对象时,我需要相对于缩放因子调整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()));
Run Code Online (Sandbox Code Playgroud)
如果你想出另一种方法,或者认为我没有这样做,那么请告诉我.
谢谢
| 归档时间: |
|
| 查看次数: |
3633 次 |
| 最近记录: |