2017-12-27 8 views
0

私はJavaFX(Swingの新機能)に少し慣れていて、内部にいくつかのfxmlサブパネルを持つStackPanesを使用する傾向があります。そのうちの1つは、特定のボタンクリックまたはメニュー選択時にtoFront()に持ち込まれます。フェードアウト/フェードインの切り替えでこれをアニメートすることは可能ですか?私は数日間グーグルで行ってきましたが、この特定のケースに関連するものは何も見つかりません。StackPane内の子にtoFront()を送信する際にフェードトランジションを適用できますか?

答えて

0

toFront()は、ノードを親の子リストの末尾に移動するだけで動作します(子リストの順序によってzオーダーが決まります)。したがって、「最前面のノード」はリストの最後にあるものだけです。このノードを含む観測可能な値を作成するには、Bindings.valueAt(...)Bindings.size(...)の組み合わせを使用します。

ObjectBinding<Node> frontNode = Bindings.valueAt(stackPane.getChildren(), 
    Bindings.size(stackPane.getChildren()).subtract(1)); 

あるいは、代替実装用:

ObjectBinding<Node> frontNode = new ObjectBinding<Node>() { 

    { bind(stackPane.getChildren()); } 

    @Override 
    protected Node computeValue() { 
     if (stackPane.getChildren().isEmpty()) return null ; 
     return stackPane.getChildren().get(stackPane.getChildren().size() - 1) ; 
    } 
} 

次に、あなただけの古い値をフェードアウトし、新しい値をフェードリスナーを登録することができます以下はからあなたの出発点を与える必要があります。あなたは働くことができます。

frontNode.addListener((obs, oldNode, newNode) -> { 
    SequentialTransition fadeOutIn = new SequentialTransition(); 
    if (oldNode != null) { 
     FadeTransition fadeOut = new FadeTransition(Duration.seconds(1), oldNode); 
     fadeOut.setToValue(0); 
     fadeOutIn.getChildren().add(fadeOut); 
    } 
    if (newNode != null) { 
     FadeTransition fadeIn = new FadeTransition(Duration.seconds(1), newNode); 
     fadeIn.setFromValue(0); 
     fadeIn.setToValue(1); 
     fadeOutIn.getChildren().add(fadeIn); 
    } 
    fadeOutIn.play(); 
}); 

ものは、アプリケーションで設定されている方法によっては、ゼロにすべてのスタックペインの子の不透明度を初期化する必要があるかもしれません。

このコードはすべて、スタックペインへの参照であることに注意してください。

+0

このコードをありがとうございましたが、それを理解するまでにはしばらく時間がかかりました。私が言ったように、私はJavaFXにとってまだかなり新しいです。しかし、私はこの方法で試したが、一貫して動作しなかった。いくつかの実行では、ボタンハンドラ内のすべての正面はリスナをトリガし、フェードは機能しましたが、他の実行では、1つまたは2つのボタンがクリックされた後に動作を停止します。 – Joe1962

+0

Dang、コメントは短すぎるので、上記から続行してください: 私は考えを取って、ボタンが処理されるコントローラレベルで実装しました。クラスレベルでfadeInとfadeOutを設定し、子供は既に不透明度0で始まっているからです)。余分に必要とされたのは、現在の子ノードへの参照だったので、新しいノードでフェードアウトする前にフェードアウトする可能性があります。ああ、またfadeInは、fadeOut.setOnFinishedハンドラ(ハンドラをキャンセルするためにはfadeOut.setOnFinished(null)で終わる)の中に入れなければなりません。 – Joe1962

+0

@ Joe1962「他の実行では、1回または2回ボタンをクリックした後に動作しなくなります。あなたはおそらく[this](http://tomasmikula.github.io/blog/2015/02/10/the-trouble-with-weak-listeners.html)に入っているでしょう。 'frontNode'バインディングをローカル変数ではなくインスタンス変数にすると、それを修正する必要があります。 –

関連する問題