I want to draw a line with arrow head on it (depicting an arrow shape). I referred to a solution to this from : JavaFX - draw line with arrow (Canvas)
The above solution does not allow to make the arrow drag able, so i wrote a small code to make this drag able
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;
});
The problem here is the previous arrows are not getting cleared even after using
gc.clearRect(0,0,drawingCanvas.getWidth(),drawingCanvas.getHeight());