2016-03-22 11 views
2

誤って挿入した後、私はテキストフィールドを振りたいです。 iはコードの静的揺れアニメーションJavaFX(Translate TextField)でTranslateTransitionの後のノードに戻る

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が右に動いています。 再配置する方法はありますか?それとももっと良い方法がありますか?

答えて

1

フィールドを振りたいときはいつも新しいトランジションを作成しないでください。そうでなければ、フィールドはすでに動揺している間に振り動かされます。その結果は予測するのが難しいでしょうが、おそらくかなり望ましくありません。

もう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(); 
     } 
    } 
} 
+0

ありがとうございますjewelsea、私のif-termなしで動作するsetFromX関数です。 – kayf

0

同じように考えています。ありがとうjewelsea!

私のためのソリューションはTranslateTransitionは、静的にすると、このような静的メソッド内でそれを使用することである。このように

private static TranslateTransition tt; 
public static TranslateTransition shake(Node node) { 
    if (tt == null || tt.getNode() != node) 
    { 
     tt = new TranslateTransition(Duration.millis(50), node); 
    } 
    tt.setByX(10f); 
    tt.setCycleCount(2); 
    tt.setAutoReverse(true); 
    if (tt.getStatus() == Status.STOPPED) 
    { 
     tt.playFromStart(); 
    } 
    return tt; 
} 

前回が停止しているとき、揺れにのみ実行されます。また、NULLまたは別のノードの場合にのみ、遷移が変更されました。

関連する問題