Javafx标题为动画片速度

bla*_*ter 5 animation javafx

有没有办法设置标题窗格的动画速度?我找不到任何东西.实际上有两个问题.第一:扩展的动画比内容本身的扩展更快.你看到圆圈比第二个标题窗格向下移动的条形略慢.

第二:如何改变它们的速度.我需要它们以相同的速度,因为它看起来很奇怪.

这是一个用于测试目的的小例子:包测试;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class TestClass extends Application{

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

@Override
public void start(Stage primaryStage) throws Exception {


    VBox vb = new VBox();


    {
    TitledPane tp = new TitledPane();
    System.out.println(tp.getContextMenu());
    tp.setContent(new Circle(100));
    tp.setText("asfadf");

    tp.expandedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

                System.out.println("expand " + newValue);

        }
    });

    vb.getChildren().add(tp);
    }

    vb.getChildren().add(new Line(0, 0, 100, 0));

    {
        TitledPane tp = new TitledPane();
        tp.setContent(new Circle(100));
        tp.setText("asfadf");
        tp.expandedProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

                    System.out.println("expand " + newValue);

            }
        });

        vb.getChildren().add(tp);
        }

    vb.setStyle("-fx-background-color: gray");



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

    primaryStage.setScene(scene);

    primaryStage.show();

}
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ung 1

简短回答:没有 API 可以更改持续时间。

然而,无论如何,有两种方法可以实现它:

替代方案#1:反思

持续时间在 static Final 字段中定义com.sun.javafx.scene.control.TitledPaneSkin.TRANSITION_DURATION。使用反射,你可以改变它的值,但这真的很糟糕。不仅因为这是一个肮脏的黑客行为,还因为TitledPaneSkinOracle内部 API 无论如何都会发生变化。此外,这并不能解决不同速度的问题:

  private static void setTitledPaneDuration(Duration duration) throws NoSuchFieldException, IllegalAccessException {
    Field durationField = TitledPaneSkin.class.getField("TRANSITION_DURATION");

    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(durationField, durationField.getModifiers() & ~Modifier.FINAL);

    durationField.setAccessible(true);
    durationField.set(TitledPaneSkin.class, duration);
  }
Run Code Online (Sandbox Code Playgroud)

替代方案#2:设置你自己的皮肤

为了安全起见,您可以使用 来创建和使用自己的皮肤(首先复制现有的皮肤)titledPane.setSkin()。通过这种方式,您还可以修复不同的速度,这基本上是由线性插值与缓动插值引起的 - 但这是相当多的工作。