Javafx标题为动画片的速度

时间:2015-10-23 08:52:10

标签: animation javafx

有没有办法设置标题窗格的动画速度?我找不到任何东西。 实际上有两个问题。 第一: 扩展的动画比内容本身的扩展更快。你会看到圆圈比第二个标题窗格向下移动时的条形略慢。

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

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

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

}
}

1 个答案:

答案 0 :(得分:1)

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

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

备选方案#1:反思

持续时间在静态最终字段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()创建和使用自己的皮肤(首先复制现有皮肤)。这样你就可以修复不同的速度,这主要是由线性与简易插值引起的 - 但这是相当有用的。

相关问题