插入错误后,我想摇晃文本框。
为此,我有一个静态摇动动画代码

public static void shake(Node node) {
  TranslateTransition tt = new TranslateTransition(Duration.millis(50), node);
  tt.setByX(10f);
  tt.setCycleCount(2);
  tt.setAutoReverse(true);
  tt.playFromStart();
}


输入错误时,将在ChangeListener中调用此动画。
这可以正常工作,但是如果用户快速键入错误的字符,则TextField将向右移动。
有没有办法重新定位?还是有更好的方法来做到这一点?

最佳答案

请勿在每次要摇动磁场时都创建新的过渡,否则,在已经摇动的情况下,磁场将摇动,其结果很难预测,但可能非常不理想。

您需要做的另一件事是setFromX(0)进行转换。这实际上非常重要,因为转换转换发生的情况是,当转换转换停止时,该节点的translateX值将保持转换转换停止时的原始值。

当您在播放过渡时多次调用playFromStart时,过渡将再次停止,然后从头开始。如果您没有fromX,则起始位置将是最后一个translateX值最终所处的位置(这可能根本不是您想要的值,并且在摇动之后,该项可能会开始移动到屏幕上看似随机的位置) 。但是,如果您有一个fromX,则开始的translationX值将始终从未翻译的位置开始。

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();
        }
    }
}

09-05 02:43