/ / MouseMotionListener ukazujúci (x, y) offset - java, swing, paintcomponent, posluchače myši

MouseMotionListener zobrazujúci offset (x, y) - java, swing, paintcomponent, poslucháči myšou

Najprv tu je súvisiaci kód:

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

Tento kód teda robí, keď kliknem na komponent plátno, nakreslím obrys obdĺžnika a veľkosť sa zmení pri ťahaní myšou

Keď však kliknem a začnem ťahaťmyš, v pravom dolnom rohu obdĺžnika je posun. Zdá sa, že druhý ťaham myšou preskočí na väčšiu veľkosť. Je zaujímavé, že čím bližšie k ľavému hornému rohu súčasti plátna, na ktorý kliknem, tým bližšie veľkosť obdĺžnika je obdĺžnik, ktorý kreslím pomocou myši.

Ako to môžem vyriešiť?

odpovede:

1 pre odpoveď č. 1

Majte na pamäti, drawRect použitie x, y, width, height keďže ide o parametre, mali by ste skutočne používať deltu medzi bodom kliknutia a bodom pretiahnutia

Možno niečo ako ...

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

A nevolajte repaint z vnútra paint metódy