因此,我通常理解关键帧构造函数接受node属性和所需的最终值。

例如:


  
    新的KeyFrame(Duration.seconds(2),新的KeyValue(YourNode.layoutXProperty,75));
  


但是,Label.textFill不存在,并且getTextFill是一个吸气剂,而不是成员变量。有什么办法可以解决这个问题?

该代码将类似于:


  新的KeyFrame(Duration.seconds(2),新的KeyValue(YourNode.textFill,Color.GREEN));

最佳答案

类型为xxx的JavaFX属性T的方法命名模式为:

public Property<T> xxxProperty() // returns the property itself
public T getXxx() // returns the value of the property
public void setXxx(T x) // sets the value of the property


因此,例如,对于textFillLabel继承的Labeled属性,有一个public ObjectProperty<Paint> textFillProperty()方法,返回实际属性。

所以你所需要的就是

new KeyFrame(Duration.seconds(2), new KeyValue(label.textFillProperty(), Color.GREEN))


SSCCE:

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TextFillTransition extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Transitioning the fill of a label");
        label.setStyle("-fx-font-size: 24pt ;");

        Timeline timeline = new Timeline(
            new KeyFrame(Duration.seconds(0), new KeyValue(label.textFillProperty(), Color.RED)),
            new KeyFrame(Duration.seconds(2), new KeyValue(label.textFillProperty(), Color.GREEN))
        );
        timeline.setAutoReverse(true);
        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();

        StackPane root = new StackPane(label);
        root.setPadding(new Insets(12));
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}


java - 如何使用KeyFrame更改JavaFX Label的textFill?-LMLPHP

09-05 08:00