Java:Rectangle2D和负尺寸

时间:2011-09-24 16:39:33

标签: java graphics

我有一个脚本,用户点击一次以开始Rectangle2D。当他移动鼠标时,使用新坐标更新矩形。他再次点击结束它。然后将其存储在ArrayList中,并绘制所有这些项目。这一切都很好;这不是问题。

但是,如果第二次点击小于第一次点击(即getWidth()为负),则矩形不会显示(如the documentation中所述)。我修复此脚本的脚本不起作用。它应该检测负值,然后1)减少位置值和2)使负数为正。相反,它只是向上或向左移动整个矩形(取决于哪个轴为负)并将其保持在1px。

怎么了?

private void resizeRectangle(final MouseEvent e) {
    double x = rectangle.getX(), y = rectangle.getY(), w = e.getX() - x, h = e.getY() - y;
    if (w < 0) {
        x = e.getX();
        w = -w;
    }
    if (h < 0) {
        y = e.getY();
        h = -h;
    }
    rectangle.setRect(x, y, w, h);
}

谢谢!

更新:这更接近,但仍然不能正常工作:

double x = rectangle.getX();
double y = rectangle.getY();
double w = e.getX() - x;
double h = e.getY() - y;

if (w < 0) {
    x = e.getX();
    w = originalClickPoint.getX() - e.getX();
}
if (h < 0) {
    y = e.getY();
    h = originalClickPoint.getY() - e.getY();
}
rectangle.setRect(x, y, w, h);

2 个答案:

答案 0 :(得分:3)

分配新矩形后,您还将原点(即最初按下鼠标按钮的位置)移动到当前点。您必须将此点保存在单独的字段中(而不是在矩形本身中)。

x = Math.min(e.getX(), originalClickPoint.getX());
w = Math.abs(originalClickPoint.getX() - e.getX());

y = Math.min(e.getY(), originalClickPoint.getY());
h = Math.abs(originalClickPoint.getY() - e.getY());

另一种方法是不校正矩形的负宽度/高度,但在绘制时创建一个新的(已校正的)矩形。

答案 1 :(得分:1)

看看Custom Painting ApproachesDrawOnComponent示例的源代码显示了我是如何做到的。