1
我工作的一個自定義的控制和現在用的StyleablePropertyFactory嘗試做一個設置樣式屬性,如下所示:StyleableProperty在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);
然後我有getter和setter這讓我訪問在值讀取:
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;
}
在構造函數中,我設置外觀和風格看出來:
this.setSkin(new RackControlSkin(this));
getStyleClass().add("rack-control");
然後在我的皮膚(雖然這並不重要,我從我得到它)我想,如下所示的CSS屬性加載:
System.out.println(control.getCssMetaData().stream().filter(c -> c.getProperty().equals("-fx-default-tube-color")).findFirst().get());
System.out.println(control.getDefaultTubeColor());
此打印出:
CSSProperty {property: -fx-default-tube-color, converter: ColorConverter, initalValue: 0x000000ff, inherits: false, subProperties: []}
0x000000ff
所以我知道屬性被從下面的CSS文件中找到:
.rack-control {
-fx-default-tube-color: red;
}
當它被從場景稱爲顯示在我的測試代碼:
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();
所以據我所見;我正在做的一切正確,但價值只是沒有從CSS文件加載。任何人都可以向我提供一個指針,說明我在這裏做錯了嗎?
非常感謝您閱讀這個問題,並且非常感謝您的任何建議!
乾杯,
尼爾