1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
   | package test;
 
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
 
/**
 *
 * @author Fabrice
 */
public class Main extends Application {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String... args) {
        Application.launch(Main.class, args);
    }
    private Rectangle rectangle = new Rectangle(100, 100, 200, 100);
    private Button button = new Button("Start");
 
    /**
     * {@inheritDoc}
     */
    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        rectangle.setArcHeight(10);
        rectangle.setArcWidth(10);
        rectangle.setFill(new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, new Stop[]{
                    new Stop(0, Color.RED),
                    new Stop(1, Color.DARKRED)
                }));
        button.setLayoutX(250);
        button.setLayoutY(250);
        button.setOnAction(new EventHandler<ActionEvent>() {
 
            /**
             * {@inheritDoc}
             */
            @Override
            public void handle(ActionEvent event) {
                toggleAnimation();
            }
        });
        root.getChildren().addAll(rectangle, button);
        Scene scene = new Scene(root);
        primaryStage.setTitle("JavaFX 2.0 animation + bind test");
        primaryStage.setWidth(600);
        primaryStage.setHeight(600);
        primaryStage.setScene(scene);
        primaryStage.setVisible(true);
        animationProperty().addListener(new ChangeListener<Timeline>() {
 
            /**
             * {@inheritDoc}
             */
            @Override
            public void changed(ObservableValue<? extends Timeline> observable, Timeline oldValue, Timeline newValue) {
                button.setText(newValue == null ? "Start" : "Stop");
            }
        });
    }
 
    private void toggleAnimation() {
        if (getAnimation() == null) {
            Timeline animation = new Timeline();
            animation.setAutoReverse(true);
            animation.setCycleCount(Timeline.INDEFINITE);
            final KeyValue<Number> keyValue = new KeyValue<>(rectangle.widthProperty(), 100, Interpolator.EASE_BOTH);
            final KeyFrame keyFrame = new KeyFrame(new Duration(2000), keyValue);
            animation.getKeyFrames().add(keyFrame);
            animation.playFromStart();
            setAnimation(animation);
        } else {
            Timeline animation = getAnimation();
            animation.jumpTo(Duration.ZERO);
            animation.stop();
            setAnimation(null);
        }
    }
    private ObjectProperty<Timeline> animationProp = new ObjectProperty<>();
 
    // Define a getter for the property's value
    public final Timeline getAnimation() {
        return animationProp.get();
    }
 
    // Define a setter for the property's value
    public final void setAnimation(Timeline value) {
        animationProp.set(value);
    }
 
    // Define a getter for the property itself
    public ObjectProperty<Timeline> animationProperty() {
        return animationProp;
    }
} | 
Partager