内联样式以子类化JavaFX

时间:2017-06-17 22:20:18

标签: java css javafx

我想以编程方式应用此样式:

.rating:disabled > .container:disabled .button:disabled{
    -fx-pref-height:15;
    -fx-background-size: cover;
    -fx-padding: 0; 
}

我试过这个,但不起作用:

    ratingHeigth.bind(mainBorderPane.prefHeightProperty().divide(0.0355));
    vipRating.styleProperty().bind(Bindings.concat(".rating:disabled > .container:disabled .button:disabled{ -fx-pref-height: ", ratingHeigth.asString(), ";}"));

1 个答案:

答案 0 :(得分:2)

这是未记录的行为,据我所知(所以你可能不想依赖它),但你可以用类似于“查找颜色”的方式创建一个“查找大小” (记录在案)。

在外部CSS样式表中,执行

vipRating.styleProperty().bind(ratingHeight.asString("disabled-button-size: %f ;"));

然后在Java做

setStyle(...)

您的代码不起作用,因为内联样式只是将字符串指定的实际样式应用于您调用setStyle的节点:内联样式不包括选择器。

上述解决方案中的想法是在CSS文件中定义一个“查找大小”(一种CSS变量),用于定义所需的高度。然后使用setStyle更改“查找大小”的值。该值由子节点继承,因此在rating CSS类的容器上使用import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.beans.binding.IntegerBinding; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Slider; import javafx.scene.control.TextField; import javafx.scene.control.TextFormatter; import javafx.scene.layout.BorderPane; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class LookedUpSizeTest extends Application { @Override public void start(Stage primaryStage) { Button button = new Button("Test"); StackPane stack = new StackPane(button); BorderPane root = new BorderPane(stack); Slider sizeSlider = new Slider(30, 350, 40); stack.styleProperty().bind(sizeSlider.valueProperty().asString("button-size: %f ;")); root.setBottom(sizeSlider); Scene scene = new Scene(root, 400, 400); scene.getStylesheets().add("style.css"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 设置它就足够了。

这是一个(更简单的)SSCCE。移动滑块,按钮将改变大小:

.root {
    button-size: 20 ;
}
.button {
    -fx-pref-height: button-size ;
}

的style.css:

{{1}}