[8u40] Post-commit review: (RT-38391) [CSS] Add support for specifying durations

David Grieve david.grieve at oracle.com
Tue Aug 26 20:22:11 UTC 2014


Added handling of 's' and 'ms' time units to the CSS parser.
Added "public static StyleConverter<?,Duration> getDurationConverter()" 
to javafx.css.StyleConverter
Added corresponding createStyleableDurationProperty methods to 
javafx.css.StyleablePropertyFactory.

https://javafx-jira.kenai.com/browse/RT-38391

Here is some sample code. Look for the setting of the in-line style 
"-my-duration" from a listener on the slider valueProperty.

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.Property;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.css.CssMetaData;
import javafx.css.Styleable;
import javafx.css.StyleableProperty;
import javafx.css.StyleablePropertyFactory;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.SVGPath;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.util.List;

public class Main extends Application {

     private static class TestNode extends Rectangle {

         public TestNode() {
             super(100, 100);
         }

         StyleablePropertyFactory<TestNode> factory = new 
StyleablePropertyFactory<>(Rectangle.getClassCssMetaData());
         StyleableProperty<Duration> myDuration = 
factory.createStyleableDurationProperty(this, "myDuration", 
"-my-duration", (s) -> s.myDuration, Duration.millis(1000));

         @Override
         public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
             return factory.getCssMetaData();
         }
     }

     BooleanProperty fadeIn = new SimpleBooleanProperty(false);

     @Override
     public void start(Stage stage) {

         final BorderPane pane = new BorderPane();
         pane.setPadding(new Insets(10, 10, 10, 10));

         Slider slider = new Slider();
         slider.setPadding(new Insets(5, 5, 5, 10));
         slider.setMin(500d);
         slider.setMax(1500d);
         slider.setBlockIncrement(50);
         slider.setValue(1000d);
         slider.setShowTickLabels(true);
         slider.setShowTickMarks(true);
         slider.setSnapToTicks(true);
         slider.setOrientation(Orientation.VERTICAL);

         pane.setRight(slider);

         final TestNode testNode = new TestNode();
         slider.valueProperty().addListener(o -> 
testNode.setStyle("-my-duration: " + ((Property<Number>) 
o).getValue().intValue() + "ms;"));

         final Button fadeButton = new Button();
fadeButton.textProperty().bind(Bindings.when(fadeIn).then("Fade 
In").otherwise("Fade Out"));
         fadeButton.setOnAction(e -> {
             Duration duration = testNode.myDuration.getValue();
             FadeTransition transition = new FadeTransition(duration, 
testNode);
             transition.setFromValue(testNode.getOpacity());
             transition.statusProperty().addListener(o -> {
                 if (((ReadOnlyObjectProperty<Animation.Status>) 
o).getValue() == Animation.Status.STOPPED) {
                     fadeButton.setDisable(false);
                 } else {
                     fadeButton.setDisable(true);
                 }
             });
             if (fadeIn.get()) {
                 transition.setToValue(1.0);
                 transition.setByValue(5);
                 transition.setOnFinished(a -> fadeIn.set(false));
             } else {
                 transition.setToValue(0.1);
                 transition.setByValue(-5);
                 transition.setOnFinished(a -> fadeIn.set(true));
             }
             transition.playFromStart();
         });

         VBox vbox = new VBox(5, testNode, fadeButton);
         vbox.setAlignment(Pos.CENTER);
         pane.setCenter(vbox);

         Label label = new Label("Use slider to adjust duration of 
the\nFadeTransition, then click the button.");
         pane.setTop(label);

         Label status = new Label();
         status.textProperty().bind(Bindings.createStringBinding(
                 () -> testNode.myDuration.getValue().toString(),
                 (ObjectProperty<Duration>) testNode.myDuration
         ));
         pane.setBottom(status);

         BorderPane.setAlignment(label, Pos.CENTER);
         BorderPane.setAlignment(slider, Pos.CENTER);
         BorderPane.setAlignment(vbox, Pos.CENTER);
         BorderPane.setAlignment(status, Pos.BOTTOM_RIGHT);

         Scene scene = new Scene(pane, 300, 250);
         stage.setScene(scene);
         stage.show();

     }

     public static void main(String[] args) {
         launch(args);
     }

}



More information about the openjfx-dev mailing list