フィールドを振りたいときはいつも新しいトランジションを作成しないでください。そうでなければ、フィールドはすでに動揺している間に振り動かされます。その結果は予測するのが難しいでしょうが、おそらくかなり望ましくありません。
もう1つ行う必要があるのは、翻訳遷移のためのsetFromX(0)です。これは、実際には非常に重要です。なぜなら、トランジショントランジションでは、トランジションが停止したときにトランジションが停止したときの状態にノードのtranslateX値がそのまま残ります。
トランジションの再生中に複数回playFromStartを呼び出すと、トランジションは再び停止され、最初から開始されます。あなたがfromXを持っていなければ、translateXの値が最後に終わったところで始まります(これはあなたが望むものではないかもしれませんし、振ると画面上で一見無作為な位置に移動し始めるかもしれません) 。しかし、fromXがある場合、最初のtranslateXの値は常に翻訳されていない位置から始まります。
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();
}
}
}
ありがとうございますjewelsea、私のif-termなしで動作するsetFromX関数です。 – kayf