Я хочу нарисовать линию со стрелкой на ней (изображающую форму стрелки). Я сослался на решение этой проблемы: JavaFX - нарисовать линию со стрелкой (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());
Вот что происходит:
Ожидаемый результат: