通过拖动鼠标绘制正方形

时间:2013-11-10 02:12:29

标签: java swing

我正在编写一个非常类似于Microsoft Paint的Java程序。它可以绘制四种不同的形状:线条,椭圆形,矩形和正方形。我非常接近完成这个,但我仍然坚持绘制正方形的逻辑。

绘制这些形状时涉及两点。第一个Point(point1)是用户按下鼠标按钮,第二个Point(point2)是用户在画布上拖动鼠标时。我相信绘制矩形和正方形应该非常相似,但是让我困惑的部分是绘制正方形时,边长度相等,所以point2不是鼠标所在的位置。

这是fillRect()方法标题,供参考:

fillRect(x, y, width, height)

我绘制矩形的功能代码如下:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)),
            ((point1.y < point2.y) ? point1.y : point2.y), 
            Math.abs(point2.x - point1.x), 
            Math.abs(point2.y - point1.y));

我尝试使用相同的代码绘制正方形,除了将height参数更改为等于width参数,因为正方形具有相等的长边:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)), 
            ((point1.y < point2.y) ? point1.y : point2.y), 
            Math.abs(point2.x - point1.x), 
            Math.abs(point2.x - point1.x)); //same as width

我不知道宽度和高度相等的问题是什么。当向下向左或向右绘制时它起作用,但当然如果你向下拉直,形状不会扩展。单击并向上拖动不起作用;方块只是沿着Y轴用鼠标向上移动而不是扩展。

有没有人能指出我关于从两点画广场的逻辑的正确方向?

如果需要,我可以更好地解释我的代码。

2 个答案:

答案 0 :(得分:0)

您应该在MouseDragged方法中进行两次计算 - 首先应计算矩形的两个角点p1和p2,然后才能计算宽度。点p1很容易 - 它始终是第一个按下的点,但是p2需要一个简单的计算。一旦澄清了这些,您的计算就会失败。

,例如:

  int width = Math.abs(pointA.x - pointB.x);
  int height = Math.abs(pointA.y - pointB.y);

  width = Math.max(width, height);
  height = width;

  int x = pointA.x > pointB.x ? pointA.x - width : pointA.x;
  int y = pointA.y > pointB.y ? pointA.y - width : pointA.y;

  g.fillRect(x, y, width, height);

答案 1 :(得分:0)

如果我使用工具绘制正方形,我希望在绘制时我的鼠标光标将保留在正方形的一侧。如果你总是使用x距离作为边,那么如果我向下绘制的距离比横向更远,则光标将位于正方形之外。

我认为,在拖动过程中,代码需要计算距离原点的x距离或距离是否更长,并将其用作正方形的一侧。然后光标将位于其中一侧,并且该侧将延伸到光标之外的正方形角落。

我不知道为什么画面会出错 - 很难确定我明白你说错了什么。