如何使用鼠标拖动绘制矩形和椭圆?

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),拖动应该是椭圆的半径。

【问题讨论】:

drawRectdrawOval 都期望 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#drawRectGraphics#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 的工作示例...

【讨论】:

以上是关于如何使用鼠标拖动绘制矩形和椭圆?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按下和拖动在 Qt Quick/QML 画布中绘制一个矩形

在鼠标拖动C#上绘图时形状不可见

如何在拖动鼠标时平滑填充椭圆

OpenGL用鼠标拖动绘制矩形?

CorelDraw矩形工具的使用方法和应用技巧

如何通过鼠标拖动选择铁选择器中的多个元素