gpt4 book ai didi

animation - Javafx titledpane 动画速度

转载 作者:行者123 更新时间:2023-12-02 22:49:30 28 4
gpt4 key购买 nike

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

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

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

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

}
}

最佳答案

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

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

替代方案#1:反射(reflection)

持续时间在静态最终字段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() 创建并使用自己的皮肤(首先复制现有皮肤)。通过这种方式,您还可以修复不同的速度,这基本上是由线性插值与缓动插值引起的 - 但这是相当多的工作。

关于animation - Javafx titledpane 动画速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33298363/

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