【发布时间】:2019-10-23 12:43:04
【问题描述】:
我想画一条带箭头的线(描绘箭头形状)。我提到了一个解决方案:JavaFX - draw line with arrow (Canvas)
上面的解决方案不允许箭头可以拖动,所以我写了一个小代码来使这个可以拖动
void drawArrow(int x1, int y1, int x2, int y2) {
gc.clearRect(0, 0,drawingCanvas.getWidth(), drawingCanvas.getHeight());
gc.setFill(Color.BLACK);
double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = (int) Math.sqrt(dx * dx + dy * dy);
Transform transform = Transform.translate(x1, y1);
transform = transform.createConcatenation(Transform.rotate(Math.toDegrees(angle), 0, 0));
gc.setTransform(new Affine(transform));
gc.strokeLine(0, 0, len, 0);
gc.fillPolygon(new double[]{len, len - ARR_SIZE, len - ARR_SIZE, len}, new double[]{0, -ARR_SIZE, ARR_SIZE, 0},
4);
}
gc=drawingCanvas.getGraphicsContext2D();
drawingCanvas.setOnMousePressed( e -> {
startX = prevX = currentX = (int)e.getX();
startY = prevY = currentY = (int)e.getY();
dragging = true;
drawArrow(startX, startY, currentX, currentY);
});
drawingCanvas.setOnMouseDragged( e -> {
if (!dragging)
return;
currentX = (int)e.getX();
currentY = (int)e.getY();
gc.clearRect(0,0,drawingCanvas.getWidth(),drawingCanvas.getHeight());
if (startX == currentX || startY == currentY)
return;
drawArrow(startX, startY, currentX, currentY);
prevX = currentX;
prevY = currentY;
});
drawingCanvas.setOnMouseReleased( e -> {
dragging = false;
if (startX == currentX || startY == currentY)
return;
drawArrow(startX, startY, currentX, currentY);
prevX = currentX;
prevY = currentY;
});
这里的问题是之前的箭头即使在使用后也没有被清除
gc.clearRect(0,0,drawingCanvas.getWidth(),drawingCanvas.getHeight());
【问题讨论】:
-
看this。每次时间轴循环时,Jewelsea 都会重置背景颜色。你应该做类似的事情。
-
每当你需要一些可拖动的东西时,你应该问问自己 Canvas 是否是正确的选择。
-
谢谢@Sedrick,但这个解决方案对我不起作用。
-
" 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确的问题陈述对其他读者没有用处。请参阅:minimal reproducible example。"
-
@Nirman 是的,当然。您可以使用使用 Shapes 表示图形对象的场景图,并且因为它们也是节点,您可以将鼠标侦听器附加到它们并移动它们,而无需手动清除和重新绘制。
标签: javafx