有没有办法设置标题窗格的动画速度?我找不到任何东西。 实际上有两个问题。 第一: 扩展的动画比内容本身的扩展更快。你会看到圆圈比第二个标题窗格向下移动时的条形略慢。
第二: 如何改变它们的速度。我需要它们以相同的速度,因为它看起来很奇怪。
这是一个用于测试目的的小例子: 包装测试;
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();
}
}
答案 0 :(得分:1)
简短回答:没有API可以改变持续时间。
然而,无论如何,有两种方法可以实现它:
持续时间在静态最终字段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);
}
为了安全起见,您可以使用titledPane.setSkin()
创建和使用自己的皮肤(首先复制现有皮肤)。这样你就可以修复不同的速度,这主要是由线性与简易插值引起的 - 但这是相当有用的。