如何使用鼠标拖动绘制矩形和椭圆?
Posted
技术标签:
【中文标题】如何使用鼠标拖动绘制矩形和椭圆?【英文标题】:How do you draw a rectangle and an oval using mouse dragging? 【发布时间】:2014-10-14 14:57:31 【问题描述】:我了解如何使用 MouseMotionListener,但我无法正确设置用于绘制矩形和椭圆形的参数。
这是我对矩形的尝试,但问题是如果从起点向左走,矩形会被填满。
public void draw(Graphics g)
g.drawRect((int)startPoint.getX(), (int)startPoint.getY(),(int)controlPoint.getX() - (int)startPoint.getX(), (int) controlPoint.getY() - (int)startPoint.getY());
这是我的圈子方法,这似乎工作正常。但是我不能把它改成椭圆形。
public void draw(Graphics g)
g.drawOval((int)startPoint.getX() - (int)controlPoint.distance(startPoint),((int)startPoint.getY() - (int)controlPoint.distance(startPoint)),
(int)controlPoint.distance(startPoint)*2,(int)controlPoint.distance(startPoint)*2);
mousePressed 必须是圆心(startPoint),拖动应该是椭圆的半径。
【问题讨论】:
drawRect
和 drawOval
都期望 x, y, width, height
...您的开始 x 或开始 y 可能小于结束 x 或结束 y 的位置。所以你需要弥补这一点......
【参考方案1】:
为了简洁起见,让我将变量名从 startPoint
更改为 sp
并从 controlPoint
更改为 cp
,然后对您的代码进行这些更改就可以了:
int minX = Math.min(sp.x, sp.y);
int minY = Math.min(sp.x, sp.y);
int width = Math.abs(cp.x - sp.x);
int height = Math.abs(cp.y - sp.y);
g.drawRect(minX, minY, width, height);
g.drawOval(minX, minY, width, height);
原因是这些方法应该接收左上角坐标,以及正在绘制的矩形/椭圆的边界框的宽度和高度。
【讨论】:
【参考方案2】:Graphics#drawRect
和 Graphics#drawOval
都希望参数表示 x, y, width, height
,而不是 x1, y1, x2, y2
...
您的起点可能大于终点,导致宽度和/或高度中的一个或两个为负值(基于width = x1 - x2
)。 Graphics
API 不太喜欢负值。在计算起点和大小时,您需要考虑到这一点。
问题的本质可以使用类似...的方法来解决
int minX = Math.min(currentX, startX);
int minY = Math.min(currentY, startY);
int maxX = Math.max(currentX, startX);
int maxY = Math.max(currentY, startY);
int x = minX;
int y = minY;
int width = maxX - minX;
int height = maxX - minX;
查看java draws rectangle one way not both 的工作示例...
【讨论】:
以上是关于如何使用鼠标拖动绘制矩形和椭圆?的主要内容,如果未能解决你的问题,请参考以下文章