2016-03-18 20 views
1

円の形をしたJavaFX FXMLシーンがあります。各円は電球を表します。電球は特定のJavaFX CSSクラス(「lightOn」など)があるときに点灯し、それ以外の場合は消灯します。 CSSは円の外観を定義し、 "lightOn"クラスがあるときに輝くように見せ、クラスがないときは淡色にします。モデル状態に基づいてJavaFXスタイルクラスを変更してください。

また、ブール値のコレクションを保持するモデルとしてプレーンJavaオブジェクトがあります。各ブール値はビューの個々の電球に属し、ライトがオンかオフかを示します。

ビューの個々の「電球」のスタイルクラスを、その状態を表すモデルのブール値フィールドにどのように接続できますか?私。ブール値が変更されたときにスタイルクラスを更新する必要があります。

(スタイルクラスが何らかのプロパティバインディングによって自動的に更新される必要はありませんが、それでも問題ありません)ビューが更新されると、たとえばコントローラによってモデルを定期的にポーリングするインスタンス)。

答えて

0

これには、CSS based psuedo-classに基づいてプロパティを使用できます。

CSS psuedo-classがサポートするプロパティをモデルオブジェクトのプロパティにバインドすることができます。そのため、モデルを更新するときに、関連付けられたビューのCSS擬似クラスが自動的に変更され、必要に応じてビューが更新されます。

下の画像では、各円が電球を表しています。各バルブには、その状態を表す関連プロパティ(バルブがオンかどうかを示すBooleanProperty)があります。プロパティのinvalidated()メソッドは、関連するCSS疑似クラス状態への変更の通知をトリガするために使用されます。この状態では、電球がオンになっているかどうかによって電球のスタイルが更新されます。

onProperty()はバルブの公開されたプロパティであるため、モデルの適切なブール値プロパティにバインドできます。これは、チェックボックスやトグルボタンなど、JavaFX APIの他のCSS擬似クラスサポートコントロールがどのように機能するかについて、いくつかの点で同様の実装です。

image

bulb.css

.bulb { 
    -fx-fill: lightslategray; 
} 

.bulb:on { 
    -fx-fill: gold; 
} 

LightArray.java

import javafx.application.Application; 
import javafx.beans.property.*; 
import javafx.css.PseudoClass; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.layout.HBox; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 

public class LightArray extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     Bulb bulb1 = new Bulb(); 
     Bulb bulb2 = new Bulb(); 
     bulb2.setOn(true); 

     final HBox layout = new HBox(10, bulb1, bulb2); 
     layout.setPadding(new Insets(10)); 
     Scene scene = new Scene(layout); 
     scene.getStylesheets().add(
       this.getClass().getResource("bulb.css").toExternalForm() 
     ); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    static private class Bulb extends Circle { 
     Bulb() { 
      super(30); 
      getStyleClass().add("bulb"); 
     } 

     public void setOn(boolean on) { 
      this.on.set(on); 
     } 

     public boolean isOn() { 
      return on.get(); 
     } 

     public BooleanProperty onProperty() { 
      return on; 
     } 

     public BooleanProperty on = 
       new BooleanPropertyBase(false) { 
        @Override protected void invalidated() { 
         pseudoClassStateChanged(ON_PSEUDO_CLASS, get()); 
        } 

        @Override public Object getBean() { 
         return Bulb.this; 
        } 

        @Override public String getName() { 
         return "on"; 
        } 
       }; 

     private static final PseudoClass 
       ON_PSEUDO_CLASS = PseudoClass.getPseudoClass("on"); 
    } 
} 
+0

それはあなたのソリューションを消化するために私にしばらく時間がかかりました。それは多くの面で本当に素晴らしいです。私は特にサークルをカスタム "バルブ"コントロールに変えるのが好きです。これは、単純な「円」よりはるかにはっきりとした視点での役割を果たします。 – jhunovis

関連する問題