插入错误后,我想摇晃文本框。
为此,我有一个静态摇动动画代码
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();
}
}
}