Erstelle nicht jedes Mal einen neuen Übergang, wenn du das Feld schütteln willst, sonst wird das Feld zittern, während es bereits zittert, dessen Ergebnis schwer vorhersehbar, aber wahrscheinlich ziemlich unerwünscht wäre.
Die andere Sache, die Sie tun müssen, ist setFromX(0) für den Übergang zu übersetzen. Dies ist eigentlich ziemlich wichtig, denn was mit einem Translate-Übergang passiert, ist, dass der translateX-Wert für den Knoten bei seinem Stopp bei dem bleibt, was er war, als der Übergang aufhörte.
Wenn Sie playFromStart mehrmals während der Wiedergabe aufrufen, wird der Übergang erneut gestoppt und dann von Anfang an gestartet. Wenn Sie kein fromX haben, dann ist der Anfang, wo auch immer der Wert von translateX zuletzt gelandet ist (was vielleicht nicht das ist, was Sie wollen und nach dem Schütteln könnte sich der Gegenstand in scheinbar zufällige Positionen auf dem Bildschirm bewegen) . Wenn Sie jedoch ein fromX haben, beginnt der anfängliche translateX-Wert immer von einer nicht übersetzten Position.
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class ShakenNotStirred extends Application {
@Override
public void start(Stage stage) throws Exception {
TextField field = new TextField();
Shaker shaker = new Shaker(field);
field.textProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
try {
Integer.parseInt(newValue);
} catch (NumberFormatException e) {
shaker.shake();
}
}
});
StackPane layout = new StackPane(field);
layout.setPadding(new Insets(20));
stage.setScene(new Scene(layout));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
class Shaker {
private TranslateTransition tt;
public Shaker(Node node) {
tt = new TranslateTransition(Duration.millis(50), node);
tt.setFromX(0f);
tt.setByX(10f);
tt.setCycleCount(2);
tt.setAutoReverse(true);
}
public void shake() {
tt.playFromStart();
}
}
}
Dank juwelsea, mit der setFromX-Funktion funktioniert es ohne meine if-Laufzeit. – kayf