【问题标题】:Javafx titledpane animation speedJavafx titledpane 动画速度
【发布时间】:2015-10-23 08:52:09
【问题描述】:

有没有办法设置标题窗格的动画速度?我什么也找不到。 其实有两个问题。 第一的: 展开的动画比内容本身的展开要快。您会看到圆圈比第二个标题窗格中的条向下移动的速度稍慢。

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

这是一个用于测试目的的小示例: 封装测试;

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 日,在bugs.openjdk.java.net/browse/JDK-8225574 处打开了一个未解决的 jdk 问题,将继续监控..

标签: animation javafx


【解决方案1】:

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

但是,无论如何,有两种方法可以实现:

替代方案 #1:反射

持续时间在静态最终字段com.sun.javafx.scene.control.TitledPaneSkin.TRANSITION_DURATION 中定义。使用反射,你可以改变它的值但这真的很糟糕。不仅因为这是一个肮脏的 hack,还因为 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() 创建和使用自己的皮肤(从复制现有皮肤开始)。通过这种方式,您还可以修复不同的速度,这基本上是由线性插值与缓动插值引起的 - 但这是相当多的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2016-09-29
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多