gpt4 book ai didi

java - 用鼠标拖动时形状位置不会重绘

转载 作者:行者123 更新时间:2023-12-02 06:32:11 24 4
gpt4 key购买 nike

我在 Canvas 上画了一个实心圆,我试图让它根据鼠标的单击和拖动方法移动。我已经设法检查鼠标指针是否在圆圈的范围内,并且当我拖动鼠标时,存储圆圈位置的变量会按预期更新,但圆圈本身在我拖动时不会重新绘制(它最多只会闪烁)。我的问题是最后我重写了 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");
}
});

最佳答案

example所示,一种方法是维护两个 Point 实例。其中一个保存鼠标最后的位置;另一个持有所需的目标位置;两者都位于组件相对坐标中。

mousePressed()中,

  • 初始化上次鼠标位置。

  • (可选)将目标标记为选定。

  • 调用repaint()以显示选定的外观。

mouseDragged()中,

  • 根据新旧鼠标位置之间的差异更新目标位置。

  • 将上次鼠标位置更新为当前鼠标位置。

  • 调用repaint()

关于java - 用鼠标拖动时形状位置不会重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com