我有一个脚本,用户点击一次以开始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);
答案 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 Approaches。 DrawOnComponent
示例的源代码显示了我是如何做到的。