Quando você precisar acessar um valor anterior de um observable e o atual, utilize o change listener. Change listeners fornece ao observable o antigo e o novo valor.
Change listeners pode ser mais custoso, desde que ele precise monitorar muita informação. Vamos fazer uma versão do código sem o lambda.
Código atual:
package sample;
import javafx.animation.Animation;
import javafx.animation.Interpolator;
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ObservableObjectValue;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.effect.Reflection;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
Ellipse ellipse = new Ellipse(110, 70);
ellipse.setFill(Color.LIGHTBLUE);
Text text = new Text(“Minhas Formas”);
text.setFont(new Font(“Arial Bold”, 24));
Reflection r = new Reflection();
r.setFraction(.8);
r.setTopOffset(1.0);
text.setEffect(r);
StackPane stackPane = new StackPane();
// Define RotateTransition
RotateTransition rotate = new RotateTransition(
Duration.millis(2500), stackPane);
rotate.setToAngle(360);
rotate.setFromAngle(0);
rotate.setInterpolator(Interpolator.LINEAR);
// configure mouse click handler
stackPane.setOnMouseClicked(mouseEvent -> {
if (rotate.getStatus().equals(Animation.Status.RUNNING)) {
rotate.pause();
} else {
rotate.play();
}
});
stackPane.getChildren().addAll(ellipse, text);
Text text2 = new Text(“”);
text2.setFont(new Font(“Arial Bold”, 24));
rotate.statusProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
text2.setText(“Animation status: ” +
((ObservableObjectValue<Animation.Status>)observable)
.getValue());
}
});
VBox vBox = new VBox();
vBox.setAlignment(Pos.CENTER);
vBox.getChildren().addAll(stackPane, text2);
Scene scene = new Scene(vBox, 350, 330, Color.LIGHTYELLOW);
stage.setTitle(“Minhas Formas com JavaFX”);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Vamos fazer as mudanças:
rotate.statusProperty().addListener(
new ChangeListener<Animation.Status>() {
@Override
public void changed(
ObservableValue<? extends Animation.Status> observableValue,
Animation.Status oldValue, Animation.Status newValue) {
text2.setText(“Estava ” + oldValue + “, Agora ” + newValue);
}
});
VBox vBox = new VBox();
vBox.setAlignment(Pos.CENTER);
vBox.getChildren().addAll(stackPane, text2);
Scene scene = new Scene(vBox, 450, 330, Color.LIGHTYELLOW);
stage.setTitle(“Minhas Formas com JavaFX”);
stage.setScene(scene);
stage.show();
Vamos para a versão lambda.
rotate.statusProperty().addListener(
(observableValue, oldValue, newValue) -> {
text2.setText(“Estava ” + oldValue + “, Agora ” + newValue);
})
Veja que na imagem trás dois valores, a situação que estava e a situação atual da animação.
Fonte: The Definitive Guide to Modern Java Clients with JavaFX
Deixe um comentário