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

时间:2014-08-21 04:55:52

标签: java graphics awt mouseevent

我理解如何使用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),拖动应该是椭圆的半径。

2 个答案:

答案 0 :(得分:0)

  • 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的工作示例......

答案 1 :(得分:0)

让我简短地将变量名称从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);

原因是这些方法应该接收左上角坐标,以及绘制矩形/椭圆的边界框的宽度和高度。