2017-08-14 8 views
1

Je travaille sur un contrôle personnalisé et je suis en utilisant le StyleablePropertyFactory pour essayer de faire une propriété styleable comme suit:StyleableProperty dans JavaFX CSS

private static final StyleablePropertyFactory<RackControl> FACTORY = new StyleablePropertyFactory<>(RackControl.getClassCssMetaData()); 
    private StyleableProperty<Color> defaultTubeColor = 
      FACTORY.createStyleableColorProperty(this, "defaultTubeColor", "-fx-default-tube-color", rc -> rc.defaultTubeColor); 

J'ai ensuite eu des accesseurs qui me permettent d'accéder la lecture de la valeur:

public Color getDefaultTubeColor() { 
    return defaultTubeColor.getValue(); 
} 

public void setDefaultTubeColor(Color defaultTubeColor) { 
    System.out.println("Set default tube color"); 
    this.defaultTubeColor.setValue(defaultTubeColor); 
} 

@SuppressWarnings("unchecked") 
public ObservableValue<Color> defaultTubeColorProperty() { 

    return (ObservableValue<Color>) defaultTubeColor; 
} 

dans le constructeur, je suis en train de la peau et du style à regarder pour:

this.setSkin(new RackControlSkin(this)); 
    getStyleClass().add("rack-control"); 

ensuite dans ma peau (si cela ne compte pas vraiment où je l'obtenir à partir) Je suis en train de charger dans la propriété css comme suit:

System.out.println(control.getCssMetaData().stream().filter(c -> c.getProperty().equals("-fx-default-tube-color")).findFirst().get()); 
    System.out.println(control.getDefaultTubeColor()); 

Ceci affiche:

CSSProperty {property: -fx-default-tube-color, converter: ColorConverter, initalValue: 0x000000ff, inherits: false, subProperties: []} 
0x000000ff 

donc je sais que la propriété est trouvé dans le fichier css suivant:

.rack-control { 
    -fx-default-tube-color: red; 
} 

Quand il est appelé de la scène comme indiqué dans mon code de test:

VBox root = new VBox(); 
RackControl control = new RackControl(8,12); 
root.getChildren().addAll(control); 
VBox.setVgrow(control, Priority.ALWAYS); 
Scene scene = new Scene(root, 320, 200); 
String css = this.getClass().getResource("rackcontrol.css").toExternalForm(); 
scene.getStylesheets().add(css); 
//Scene scene = new Scene((Parent) FXMLLoader.load(getClass().getResource("TestUI.fxml"))); 
primaryStage.setTitle("Custom control"); 
primaryStage.setScene(scene); 
primaryStage.show(); 

Donc, autant que je peux voir; Je fais tout correctement, mais la valeur n'est pas chargée depuis le fichier css. Quelqu'un peut-il me fournir un pointeur sur ce que je fais mal ici s'il vous plaît?

Merci d'avance de lire la question et merci pour tout conseil!

Cheers,

Neil

Répondre

1

Nous avons trouvé la réponse en déconstruisant les classes méta - propriétés CSS ne sont pas réglées avant après la constrcutor a été appelé. Par conséquent, vous devez configurer la peau pour écouter les changements dans le css et ensuite faire le dessin etc.