2017-08-14 65 views
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文件加載。任何人都可以向我提供一個指針,說明我在這裏做錯了嗎?

非常感謝您閱讀這個問題,並且非常感謝您的任何建議!

乾杯,

尼爾

回答

1

我們發現答案通過解構元類 - CSS屬性未設置直到後constrcutor被調用。因此,您需要設置皮膚以聽取css中的更改,然後執行繪圖等。