我在画布上绘制了一个填充的圆圈,我试图让它基于鼠标的单击和拖动方法移动。我已经设法检查鼠标指针是否在圆圈的范围内,当我拖动鼠标时,存储圆圈位置的变量应该更新,但是当我拖动时圆圈本身不会重绘(它将做的最多是闪烁)。我的问题是在最后我要覆盖mouseDragged()
。
getCanvas().addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent event)
{
super.mouseClicked(event);
Point mousePosition = event.getPoint();
if (_circle.getShape1().contains(mousePosition))
Main.debugLabel.setText("Clicked");
}
@Override
public void mouseReleased(MouseEvent event)
{
super.mouseReleased(event);
_circle.isDraggable = false;
Main.debugLabel.setText("Released");
}
@Override
public void mousePressed(MouseEvent event)
{
super.mousePressed(event);
int button = event.getModifiers();
if (button == InputEvent.BUTTON1_MASK)
{
_circle.isDraggable = true;
Main.debugLabel.setText("Pressed");
}
}
});
getCanvas().addMouseMotionListener(new MouseAdapter()
{
@Override
public void mouseDragged(MouseEvent event)
{
super.mouseDragged(event);
Point mousePosition = event.getPoint();
if (_circle.isDraggable)
{
_circle.posX = mousePosition.x;
_circle.posY = mousePosition.y;
Main.debugLabel.setText("Dragging " + _circle.posX);
getCanvas().repaint();
}
}
@Override
public void mouseMoved(MouseEvent event)
{
super.mouseMoved(event);
Point mousePosition = event.getPoint();
if (_circle.getShape1().contains(mousePosition))
Main.debugLabel.setText("Within Bounds");
else if (!_circle.getShape1().contains(mousePosition) && !_circle.isDraggable)
Main.debugLabel.setText("Out of Bounds");
}
});
答案 0 :(得分:2)
如此example所示,一种方法是维护两个 Point
实例。一个握住最后一个鼠标位置;另一个拥有所需的目标位置;两者都在组件相对坐标中。
在mousePressed()
,
初始化最后一个鼠标位置。
(可选)将目标标记为已选中。
调用repaint()
以显示所选的外观。
在mouseDragged()
,
通过新鼠标位置和旧鼠标位置之间的差异更新目标位置。
将最后一个鼠标位置更新为当前鼠标位置。
调用repaint()
。