我理解如何使用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),拖动应该是椭圆的半径。
答案 0 :(得分:0)
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的工作示例......
答案 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);
原因是这些方法应该接收左上角坐标,以及绘制矩形/椭圆的边界框的宽度和高度。