2015-10-15 5 views
0

Прежде всего, здесь соответствующий код:MouseMotionListener показывает (х, у) смещение

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 использует x, y, width, height, как это параметры, вы должны фактически использовать дельта между точкой щелчка и точкой сопротивления

Может быть что-то вроде ...

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

И, не назовите repaint от paint методов

+0

Oh duh: /. Спасибо за это, я знал, что это было что-то глупое. – ASchmalzWorld

+0

Вероятно, это не очевидно из ответа, но 'drawRect' не принимает отрицательные значения width/height;) – MadProgrammer