有没有办法设置标题窗格的动画速度?我找不到任何东西.实际上有两个问题.第一:扩展的动画比内容本身的扩展更快.你看到圆圈比第二个标题窗格向下移动的条形略慢.
第二:如何改变它们的速度.我需要它们以相同的速度,因为它看起来很奇怪.
这是一个用于测试目的的小例子:包测试;
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)
简短回答:没有 API 可以更改持续时间。
然而,无论如何,有两种方法可以实现它:
持续时间在 static 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);
}
Run Code Online (Sandbox Code Playgroud)
为了安全起见,您可以使用 来创建和使用自己的皮肤(首先复制现有的皮肤)titledPane.setSkin()
。通过这种方式,您还可以修复不同的速度,这基本上是由线性插值与缓动插值引起的 - 但这是相当多的工作。
归档时间: |
|
查看次数: |
815 次 |
最近记录: |