【问题标题】: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 的位置。所以你需要弥补这一点......

标签: java graphics awt mouseevent


【解决方案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 的工作示例...

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多