2015-10-15 78 views
0

首先,这里是相关的代码:的MouseMotionListener显示(X,Y)偏移

canvas = new CanvasPanel(); 
    canvas.setBackground(Color.white); 
    canvas.addMouseListener(new PointListener()); 
    canvas.addMouseMotionListener(new PointListener()); 

    JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, canvas); 


class CanvasPanel extends JPanel 
{ 
    public void paintComponent(Graphics page) 
    { 
     super.paintComponent(page); 

     if (mouseDragged == true) 
     { 
      page.drawRect(x1, y1, x3, y3); 
      canvas.repaint(); 
     } 
    } 
} 


class PointListener implements MouseListener, MouseMotionListener 
{ 
    public void mousePressed (MouseEvent event) 
    { 
     mouseDragged = true; 
     x1 = event.getX(); 
     y1 = event.getY(); 
    } 
    public void mouseReleased (MouseEvent event) 
    { 
     // some code 
    } 

    public void mouseDragged(MouseEvent event) 
    { 
     x3 = event.getX(); 
     y3 = event.getY(); 
     canvas.repaint(); 
    } 

那么这段代码做的是,当我点击画布组件,它将绘制的轮廓矩形和大小随着我拖动鼠标而变化

但是,当我单击并开始拖动鼠标时,矩形右下角有一个偏移量。它似乎跳到一个更大的尺寸第二我拖动鼠标。有趣的是,更接近我点击的画布组件的左上角,矩形大小越接近我用鼠标绘制的矩形。

我该如何解决这个问题?

回答

1

记住,drawRect使用xywidthheight,因为它的参数,你实际上应使用点击点和拖动点

也许像之间的增量...

public void paintComponent(Graphics page) 
{ 
    super.paintComponent(page); 

    if (mouseDragged == true) 
    { 
     int x = Math.min(x1, x3); 
     int y = Math.min(y1, y3); 
     int width = Math.max(x1, x3) - x; 
     int height = Math.max(y1, y3) - y; 
     page.drawRect(x, y, width, height); 
    } 
} 

而且,请不要在paint方法中调用repaint方法

+0

Oh duh:/。谢谢你,我知道这是愚蠢的 – ASchmalzWorld

+0

答案可能并不明显,但'drawRect'不接受负值的宽度/高度值;) – MadProgrammer