2015-10-23 9 views
5

Gibt es eine Möglichkeit, die Animationsgeschwindigkeit eines betitelten Panels einzustellen? Ich konnte nichts finden. Tatsächlich gibt es zwei Probleme. Erstens: Die Animation der Erweiterung ist schneller als die Erweiterung des Inhalts selbst. Sie sehen, dass der Kreis etwas langsamer ist als der Balken von der zweiten betitelten Platte nach unten bewegt wird.Javafx betiteltepane Animationsgeschwindigkeit

Zweite: Wie Sie die Geschwindigkeit von beiden ändern. Ich brauche sie mit der gleichen Geschwindigkeit, weil es komisch aussieht.

Hier ist ein kleines Beispiel für Testzwecke: Paket Test;

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

} 
} 

Antwort

1

Kurze Antwort: Es gibt keine API, um die Dauer zu ändern.

Allerdings gibt es zwei Möglichkeiten, es zu erreichen, trotzdem:

Alternative # 1: Reflexion

Die Dauer des statischen Endfeld com.sun.javafx.scene.control.TitledPaneSkin.TRANSITION_DURATION definiert ist. Mit Reflection können Sie den Wert ändern , aber das ist wirklich schlecht. Nicht nur, weil das ein schmutziger Hack ist, sondern auch, weil TitledPaneSkin Oracle interne API ist, die sich ändern kann sowieso. Auch dies tut nicht das Problem mit den unterschiedlichen Geschwindigkeiten zu beheben:

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

Alternative # 2: Stellen Sie Ihre eigene Haut

auf der sicheren Seite zu sein, können Sie erstellen und verwenden Sie Ihre eigene Haut (Beginnen Sie mit dem Kopieren der vorhandenen) mit titledPane.setSkin(). Auf diese Weise können Sie auch die unterschiedliche Geschwindigkeit korrigieren, die im Grunde durch lineare oder einfache Interpolation verursacht wird - aber das ist ziemlich viel Arbeit.

Verwandte Themen