首页 > 解决方案 > 无法在 Javafx 中旋转形状

问题描述

我在 JavaFX 中旋转形状时遇到问题。这是一些代码,我希望箭头指向与行相同的方向(是的,稍后我将添加翻译,将其放在行尾,但一次只做一件事)。

println语句向我显示theta当我移动起点和终点时正确更新,但箭头顽固地保持在原始角度。为了使形状旋转,我还需要执行另一个步骤,还是应该以不同的方式进行?

package application.view;

public class Connector extends Group {
    private final DoubleProperty startX;
    private final DoubleProperty startY;
    private final DoubleProperty endX;
    private final DoubleProperty endY;

    public Connector(Line line, Polygon arrowhead, Preferences prefs) {
        arrowhead.setStroke(Color.BLACK);
        arrowhead.setStrokeWidth(1);
        arrowhead.setFill(Color.CORNFLOWERBLUE);
        startX = new SimpleDoubleProperty();
        startY = new SimpleDoubleProperty();
        endX = new SimpleDoubleProperty();
        endY = new SimpleDoubleProperty();
        thetaBinding = new DoubleBinding() {
            {
                super.bind(startX, startY, endX, endY);
            }
            @Override
            protected double computeValue() {
                return Math.atan2(getEndY() - getStartY(), getEndX() - getStartX());
            }
        };

        theta = new SimpleDoubleProperty();
        theta.bind(thetaBinding);

        theta.addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable,
                    Number oldValue, Number newValue) {
                System.out.println(newValue);
                arrowhead.rotateProperty().set((Double)newValue);
            }
        });

        lineLength = new DoubleBinding() {
            {
                super.bind(startX, startY, endX, endY);
            }
            @Override
            protected double computeValue() {
                return Math.hypot(getEndX() - getStartX(), getEndY() - getStartY()) - prefs.getDouble("CONNECTOR_ARROW_LENGTH", Defaults.CONNECTOR_ARROW_LENGTH);
            }
        };

        lineEndX = new DoubleBinding() {
            {
                super.bind(startX, lineLength, theta);
            }
            @Override
            protected double computeValue() {
                return startX.get() + lineLength.get() * Math.cos(theta.get());
            }
        };

        lineEndY = new DoubleBinding() {
            {
                super.bind(startY, lineLength, theta);
            }
            @Override
            protected double computeValue() {
                return startY.get() + lineLength.get() * Math.sin(theta.get());
            }
        };

        arrowhead.getPoints().setAll(new Double[] {
                0.0, 0.0,
                0.0, prefs.getDouble("CONNECTOR_ARROW_HALF_WIDTH", Defaults.CONNECTOR_ARROW_HALF_WIDTH),
                prefs.getDouble("CONNECTOR_ARROW_LENGTH", Defaults.CONNECTOR_ARROW_LENGTH), 0.0,
                0.0, -prefs.getDouble("CONNECTOR_ARROW_HALF_WIDTH", Defaults.CONNECTOR_ARROW_HALF_WIDTH),
        });

        line.startXProperty().bind(startX);
        line.startYProperty().bind(startY);
        line.endXProperty().bind(lineEndX);
        line.endYProperty().bind(lineEndY);

        getChildren().addAll(line, arrowhead);
    }

    public final DoubleBinding thetaBinding;
    public final DoubleProperty theta;
    public final DoubleBinding lineLength;
    public final DoubleBinding lineEndX;
    public final DoubleBinding lineEndY;

    public double getStartX() {
        return startX.get();
    }

    public void setStartX(double value) {
        startX.set(value);
    }

    public DoubleProperty startXProperty() {
        return startX;
    }

    public double getStartY() {
        return startY.get();
    }

    public void setStartY(double value) {
        startY.set(value);
    }

    public DoubleProperty startYProperty() {
        return startY;
    }

    public double getEndX() {
        return endX.get();
    }

    public void setEndX(double value) {
        endX.set(value);
    }

    public DoubleProperty endXProperty() {
        return endX;
    }

    public double getEndY() {
        return endY.get();
    }

    public void setEndY(double value) {
        endY.set(value);
    }

    public DoubleProperty endYProperty() {
        return endY;
    }
    }

标签: javafx

解决方案


推荐阅读