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

Итак, что делает этот код, так это то, что когда я нажимаю на компонент холста, он рисует контур прямоугольника, а размер изменяется при перетаскивании мышью.

Однако, когда я нажимаю и начинаю перетаскивать мышь, в правом нижнем углу прямоугольника появляется смещение. Кажется, он увеличивается в размерах, когда я перетаскиваю мышь. Интересно, что чем ближе к верхнему левому углу компонента холста я щелкаю, тем ближе размер прямоугольника к прямоугольнику, который я рисую мышью.

Как я могу это исправить?


person Zachary Schmalz    schedule 15.10.2015    source источник


Ответы (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

person MadProgrammer    schedule 15.10.2015
comment
Ого :/. Спасибо за это, я знал, что это что-то глупое - person Zachary Schmalz; 15.10.2015
comment
Вероятно, это неочевидно из ответа, но drawRect не принимает отрицательные значения ширины/высоты;) - person MadProgrammer; 15.10.2015