2015-10-23 13 views
5

Czy istnieje sposób ustawić prędkość animacji w okienku tytułowym? Nie mogłem nic znaleźć. W rzeczywistości istnieją dwie kwestie. Po pierwsze: Animacja rozwijania jest szybsza niż ekspansja samej treści. Widzisz, że krąg jest nieco wolniejszy niż pasek z drugiego pola, który się przesuwa.Javafx titledpane animacja prędkość

Po drugie: Jak zmienić prędkość obu z nich. Potrzebuję ich z taką samą szybkością, ponieważ wygląda dziwnie.

Oto mały przykład do celów testowych: test pakietowy: ;

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

} 
} 

Odpowiedz

1

Krótka odpowiedź: brak API do zmiany czasu trwania.

Jednakże, istnieją dwa sposoby, aby osiągnąć to tak:

Alternatywa # 1: Odbicie

Czas jest określony w statycznego pola końcowego com.sun.javafx.scene.control.TitledPaneSkin.TRANSITION_DURATION. Korzystając z odbicia, możesz zmienić jego wartość: , ale jest to naprawdę złe. Nie tylko dlatego, że jest to brudny hack, ale także dlatego, że TitledPaneSkin to wewnętrzny interfejs API Oracle , który i tak może ulec zmianie. Poza tym, ten robi nie rozwiązać problem z różnymi prędkościami:

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

alternatywna # 2: Ustawianie własnej skórze

Aby być na bezpiecznej stronie, można tworzyć i wykorzystywać swoją skórę (zacznij od skopiowania istniejącego), używając titledPane.setSkin(). W ten sposób można również ustalić inną prędkość, która jest w zasadzie spowodowana interpolacją liniową a łatwą interpolacją - ale to trochę pracy.