2016-03-18 4 views
1

Ich habe eine JavaFX FXML-Szene mit einer Anzahl von Kreisformen. Jeder Kreis repräsentiert eine Glühbirne. Eine Glühbirne ist eingeschaltet, wenn sie eine bestimmte JavaFX CSS Klasse hat, sagen wir "lightOn", sonst ist sie aus. Das CSS definiert das Aussehen des Kreises, so dass es scheint, wenn es die "lightOn" -Klasse hat und abgeblendet, wenn es keine Klasse hat.Ändern Sie die JavaFX-Stilklasse basierend auf dem Modellstatus

Ich habe auch ein einfaches Java-Objekt als Modell, das eine Sammlung von Booleschen Werten enthält. Jeder boolesche Wert gehört zu einer einzelnen Glühbirne der Ansicht und zeigt an, ob das Licht ein- oder ausgeschaltet ist.

Wie kann die Stilklasse der einzelnen "Glühbirnen" der Ansicht mit dem booleschen Feld des Modells verbunden werden, das ihren Zustand darstellt? I.e. Die Style-Klasse muss aktualisiert werden, wenn sich der boolesche Wert ändert.

(Es ist nicht erforderlich, dass die Stilklasse automatisch durch eine Art von Eigenschaftenbindung aktualisiert wird - obwohl das auch in Ordnung wäre. Es wäre ausreichend, wenn die Ansicht zum Beispiel von einem Controller aktualisiert würde Instanz, die das Modell regelmäßig abfragt.)

Antwort

0

Sie könnten hierfür eine Eigenschaft CSS based psuedo-class verwenden.

Wenn Sie möchten, können Sie die Eigenschaft, die von der CSS pseudo-Klasse unterstützt wird, an eine Eigenschaft Ihres Modellobjekts binden. Wenn Sie also das Modell aktualisieren, wird die CSS-Pseudoklasse der zugehörigen Ansicht automatisch geändert Die Ansicht wurde entsprechend aktualisiert.

In der Abbildung unten steht jeder Kreis für eine Glühbirne. Jede Glühbirne hat eine zugeordnete Eigenschaft, die ihren Zustand darstellt (eine BooleanProperty, die angibt, ob die Glühbirne eingeschaltet ist oder nicht). Die invalidated()-Methode der Eigenschaft wird verwendet, um Benachrichtigungen über Änderungen an einem zugeordneten CSS-Pseudoklassenstatus auszulösen, der den Stil der Glühbirne in Abhängigkeit davon aktualisiert, ob die Glühbirne eingeschaltet ist oder nicht.

Da onProperty() eine exponierte Eigenschaft der Glühbirne ist, können Sie sie an eine entsprechende boolesche Eigenschaft Ihres Modells binden. Dies ist eine ähnliche Implementierung, die in gewisser Weise mit der Funktionsweise anderer CSS-Pseudoklassen-Steuerelemente in der JavaFX-API vergleichbar ist, z. B. Kontrollkästchen und Umschaltflächen.

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

Es dauerte eine Weile, Ihre Lösung zu verdauen. Es ist wirklich großartig in vielen Aspekten. Besonders mag ich das Drehen der Kreise in benutzerdefinierte "Bulb" -Steuerelemente. Dies macht ihre Rolle in der Sicht deutlich klarer als der einfache "Kreis". – jhunovis

Verwandte Themen