Нарисуйте форму стрелки в javafx - PullRequest
0 голосов
/ 23 октября 2019

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

Вот что происходит: enter image description here

Ожидаемый результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...