@Override
public Shape getShape() {
final Ellipse2D.Double result = new Ellipse2D.Double();
final double px = Math.min(getStart().getX(), getEnd().getX());
final double py = Math.min(getStart().getY(), getEnd().getY());
final double pw = Math.abs(getStart().getX() - getEnd().getX());
result.setFrame(px, py, pw, pw);
return result;
}
所以这个getShape()将形状返回到绘制形状的类。 getStart()在点击时获取鼠标的起始点,getEnd()在鼠标释放时获得Point。现在,当我拖动绘制一个圆圈时,如果我向右或向下拖动圆圈按预期工作并展开到鼠标,如果我向上或向左拖动光圈,圆圈会扩展,因为它应该 BUT 圆圈形状随光标向上和向下移动,我不知道为什么。
答案 0 :(得分:3)
Java中的形状基于左上角作为锚点,宽度/高度是向下/向右绘制的。
您需要计算点击点和拖动点之间的边界框
public Shape getShape() {
final Ellipse2D.Double result = new Ellipse2D.Double();
final double px = Math.min(getStart().getX(), getEnd().getX());
final double py = Math.min(getStart().getY(), getEnd().getY());
final double pw = Math.abs(getStart().getX() - getEnd().getX());
result.setFrame(px, py, pw, pw);
return result;
}
问题是,您仍然使用点击点和拖动点之间的差异来计算宽度,pw
应该是maxX
和{{1}之间的差异}值
因此this example向您展示了如何计算锚点和大小属性
我仔细阅读了该帖子,但它并没有解决圈子的拖拽扩张,以及它如何上下移动。
然后你做错了什么
我试图在没有相同宽度和高度(椭圆)的情况下绘制圆形而不是圆形。
好的,所以应始终显示圆圈是从定位点绘制的,所以当minX
或minX
小于minY
' s { {1}} / clickPoint
点,然后您需要将它们调整为x
和大小的差异
所以,这将使它'#34;出现"好像圆圈始终是从初始点击点
绘制的y