StyleableProperty in JavaFX CSS

Viewed 499

I'm working on a custom control and am using the StyleablePropertyFactory to try and make a styleable property as follows:

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);

I've then got getters and setters which allow me to access the read in value:

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;
}

In the constructor I am setting a skin and style to look out for:

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

Then in my skin (though that doesn't really matter where I'm getting it from) I am trying to load in the css property as follows:

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

This prints out:

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

So I know the property is being found from the following css file:

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

When it is being called from the scene as shown in my test code:

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();

So as far as I can see; I'm doing everything correctly but the value just isn't being loaded in from the css file. Can anyone provide me with a pointer as to what I'm doing wrong here please?

Thanks, in advance, for reading the question and double thanks for any advice!

Cheers,

Neil

1 Answers
Related