gpt4 book ai didi

javafx - 为什么绑定(bind)不能与转换一起使用

转载 作者:行者123 更新时间:2023-12-04 08:24:04 25 4
gpt4 key购买 nike

我有一个 Circle及其centerX属性绑定(bind)到 text标签的属性。这是用于查看对象在屏幕上的位置。每当我在圆圈上应用过渡时,绑定(bind)似乎停止工作。这是代码中的一个片段。

//ERRONEOUS PART OF CODE
Circle circle = new Circle(50, 20, 20);
Label posLabel = new Label();
//binding
StringBinding binding = new StringBinding(){
{bind(circle.centerXProperty());}
@Override public String computeValue(){
return Double.toString(circle.getCenterX());
}
};
posLabel.textProperty().bind(binding);
//translation
TranslateTransition transition = new TranslateTransition(Duration.seconds(3), circle);
transition.setByX(250);
transition.play();
我想知道为什么绑定(bind)不适用于转换 ,如果可能的话,解决问题的方法。
附言一个完整的最小可重现示例:(我是说绑定(bind)不起作用,因为标签值停留在 50.0)
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.control.Label;
import javafx.scene.shape.Circle;
import javafx.animation.TranslateTransition;
import javafx.util.Duration;
import javafx.beans.binding.StringBinding;
public class TransitionError extends Application
{
public void start(Stage stage) throws Exception
{
//instantiating all objects
Circle circle = new Circle(50, 20, 20);
Label posLabel = new Label();
Group group = new Group(circle, posLabel);
Scene scene = new Scene(group, 300,100);
stage.setTitle("JavaFX Example");
stage.setFullScreen(true);
stage.setScene(scene);
stage.show();

//ERRONEOUS PART OF CODE
//binding
StringBinding binding = new StringBinding(){
{bind(circle.centerXProperty());}
@Override public String computeValue(){
return Double.toString(circle.getCenterX());
}
};
posLabel.textProperty().bind(binding);
//translation
TranslateTransition transition = new TranslateTransition(Duration.seconds(3), circle);
transition.setByX(250);
transition.play();
}
}

最佳答案

TranslateTransition不会改变 centerX 的值;它改变了 translateX 的值.
所以你可以这样做:

    StringBinding binding = new StringBinding(){
{bind(circle.centerXProperty(), circle.translateXProperty());}
@Override public String computeValue(){
return Double.toString(circle.getCenterX()+circle.getTranslateX());
}
};
或者您可以使用原始绑定(bind)并为 centerX 设置动画。属性(这可能更可取,因为您似乎依赖 centerX 进行更改):
// TranslateTransition transition = new TranslateTransition(Duration.seconds(3), circle);
// transition.setByX(250);
// transition.play();

Timeline timeline = new Timeline(new KeyFrame(
Duration.seconds(3),
new KeyValue(circle.centerXProperty(), circle.getCenterX()+250)
));
timeline.play();

关于javafx - 为什么绑定(bind)不能与转换一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65360588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com