将线绑定到节点的中心

时间:2015-03-16 07:22:50

标签: java javafx

我正在创建一个动画,其中我有一个由一条线连接的两个圆圈。当节点(圆圈)移动时,我希望线条绑定它们的中心。我试过了什么?

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.util.Duration;

public class BindIt extends Application {

    @Override
    public void start(Stage primaryStage) {
        DoubleProperty startX = new SimpleDoubleProperty(100);
        DoubleProperty startY = new SimpleDoubleProperty(100);
        DoubleProperty endX = new SimpleDoubleProperty(300);
        DoubleProperty endY = new SimpleDoubleProperty(300);
        Line line = new Line(100, 100, 300, 300);
        line.startXProperty().bind(startX);
        line.startYProperty().bind(startY);
        line.endXProperty().bind(endX);
        line.endYProperty().bind(endY);
        Circle c1 = new Circle(25);
        c1.setCenterX(100);
        c1.setCenterY(100);
        c1.centerXProperty().bind(startX);
        c1.centerYProperty().bind(startY);

        Circle c2 = new Circle(25);
        c2.setCenterX(300);
        c2.setCenterY(300);
        c2.centerXProperty().bind(endX);
        c2.centerYProperty().bind(endY);


        Group root = new Group();
        root.getChildren().add(line);
        root.getChildren().add(c1);
        root.getChildren().add(c2);

        Scene scene = new Scene(root, 500, 500);

        primaryStage.setTitle("Bind the line!");
        primaryStage.setScene(scene);
        final Timeline timeline = new Timeline();
        timeline.getKeyFrames().addAll(new KeyFrame(Duration.millis(0)), new KeyFrame(Duration.millis(2000), new KeyValue(c1.centerXProperty(), 200)));
        timeline.play();

        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

如果我用“绑定”删除所有行,我会移动圆圈。但是使用绑定我得到错误说“无法绑定等” 我的意思是这些行

line.startXProperty().bind(startX);
line.startYProperty().bind(startY);
line.endXProperty().bind(endX);
line.endYProperty().bind(endY);

c1.centerXProperty().bind(startX);
c1.centerYProperty().bind(startY);

c2.centerXProperty().bind(endX);
c2.centerYProperty().bind(endY);

没有这些代码就行了。但绑定不会发生。

有人可以告诉我,我在哪里做错了吗?

2 个答案:

答案 0 :(得分:1)

我找到了答案,如果你绑定一个属性它是因变量,所以它不能被改变,只能改变自变量。所以我改变了

c1.centerXProperty().bind(startX) 

startX.bind(c1.centerXProperty())

有效。感谢大家的评论。

答案 1 :(得分:0)

您收到错误

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: Circle.centerX : A bound value cannot be set.

这说明了一切。您无法在时间轴中设置圆的中心X和Y.您应该使用双重属性而不是中心(X / Y)属性。