JavaFX TitledPane动画速度

5

有没有办法设置TitledPane的动画速度?我找不到相关资料。 实际上有两个问题。 第一个问题: 展开时的动画比内容自身的展开速度快。您会发现,来自第二个TitledPane的圆比栏下移动的条稍微慢一些。

第二个问题: 如何改变它们的速度。我需要让它们以相同的速度运行,因为看起来很奇怪。

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

package test;

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();

}
}

我正在添加一个答案,因为我没有足够的声望来发布评论。截至2019年6月12日,在https://bugs.openjdk.java.net/browse/JDK-8225574上开放了一个JDK问题。将继续监视它。 - mimmoz81
2个回答

1
简短回答:没有API可以改变持续时间。
然而,有两种方法可以实现它:
替代方法1:反射
持续时间定义在静态final字段com.sun.javafx.scene.control.TitledPaneSkin.TRANSITION_DURATION中。使用反射,您可以更改其值,但这真的很糟糕。不仅因为这是一个肮脏的黑客,而且因为TitledPaneSkin是Oracle内部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);
  }

备选方案 #2:设置自己的皮肤

为了保险起见,您可以创建并使用自己的皮肤(从现有的皮肤开始复制),使用titledPane.setSkin()。这样,您还可以解决不同速度的问题,这基本上是由于线性与缓动插值引起的 - 但这需要相当多的工作。


0

只需使用类似以下的代码来禁用动画效果:

    TitledPane pane = new TitledPane();
    pane.animatedProperty().set(false);

并且扩展将尽可能快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接