2017-01-24 9 views
0

私はスレッドを使用してAnchorPaneの不透明度を変更します。 不透明度を徐々に上げるonMouseEnterメソッドと、徐々に不透明度を下げるonMouseExitedメソッドを追加します。 私は2つのペインを持っています。私のマウスがそれらのいずれかを入力すると、2つのペインはどちらも不透明になります。 その後、私は自分のアプリケーションを起動します。私は、マウスがある時間入力して終了した後、特定の不透明度で停止し、もう一方は不透明度を徐々に変えます。javafx setOpacityメソッドが何度か繰り返されても機能しない

private double base = 0.5; 

private void changeOpacity(boolean increase){ 
    new Thread(()-> { 
    while((increase && base < 0.9) || ((!increase)&&base > 0.5)){ 
     base += increase?0.01:-0.01; 
     leftPane.setOpacity(base); 
     rightPane.setOpacity(base); 
     Thread.sleep(5); 
    } 
} 
} 

私は私の下手な英語のため申し訳ありません: これが起こる理由は、私は混乱しています... 私のコードは次のようにしています。ありがとうございます!

+0

変数は、スレッドローカルにキャッシュされている(ParallelTransitionと一緒に)キーフレーム

  • 使用で既に事前定義されたFadeTransitionのforeachのノードのタイムラインを使用します。 'base'フィールドを非同期に変更するスレッドをほとんど実行しない場合、すべてのスレッドで同じ値を持つことは保証されません。 'volatile'キーワードを追加して何が起こるかを見てください。 – Dth

  • +0

    UIをバックグラウンドスレッドから変更することはできません。 'Platform.runLater(...)'の 'setOpacity(...)'に呼び出しをラップする必要があります。しかし、このために[FadeTransition'](http://docs.oracle.com/javase/8/javafx/api/javafx/animation/FadeTransition.html)を使用しないでください(オーバーヘッドを避け、最初の場所に背景スレッド)? –

    答えて

    1

    JavaFXスレッド上にいる間は、JavaFXコンポーネントの値を変更することができます(あなたがはっきりしていないもの)。

    あなたはPlatform.runLater(Runnable)を使用して自分自身を同期させる必要がありますが、あなたのケースでは、同じように悪い考えであるRunnablesとイベントループを入れ替えることになります。

    正しい方法である:

    関連する問題