Controlfx - 额定宽度

时间:2017-06-15 16:18:37

标签: java javafx controlsfx

我正在使用Controlfx中的RatingBar

我想绑定宽度值,但它不允许是一个值< 248。

@FXML
private Rating vipRating;

        vipRating.prefWidthProperty().bind(ratingVBox.prefWidthProperty());

3 个答案:

答案 0 :(得分:2)

RatingBar在CSS中有按钮选择器的填充值:

.rating > .container > .button {
    -fx-background-color: transparent;
    -fx-background-image: url("unselected-star.png");
    -fx-padding: 16 16; 
    -fx-background-image-repeat: no-repeat;
}

我们应该删除这个填充。

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

我们还应该将宽度/高度值应用于按钮而不是评级框。

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

为了以编程方式完成这项工作,还有另一种未记录的行为:

如果你这样做:

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

由于内联样式只是将字符串指定的实际样式应用于您调用setStyle(...):的节点,因此内联样式不包含选择器。

所以我们应该在CSS文件中创建一个CSS变量,如下所示:

.rating {
    button-width: 32;
    button-height: 32;
}

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

现在应该将内联样式应用于新的CSS变量。

ratingWidth.bind(centerPane.prefWidthProperty());
        vipRating.styleProperty().bind(Bindings.concat("button-width: ", ratingWidth.asString(), ";"));

答案 1 :(得分:0)

你可以这样:

DoubleBinding minPrefBinding = Bindings.createDoubleBinding(() -> {
        if(ratingVBox.getPrefWidth() < 248.0){
            return 248.0;
        }
        return ratingVBox.getPrefWidth();
    }, ratingVBox.prefWidthProperty());

 vipRating.prefWidthProperty().bind(minPrefBinding);

答案 2 :(得分:0)

调整minimum widthvipRating.setMinWidth(Region.USE_PREF_SIZE);vipRating.setMinWidth(0);

编辑:

调查ControlsFX Source似乎Rating控件使用PNG图形来显示它的外观。这些图标为32x32像素,对齐5星图标的容器间距为4。

简单数学:(32 + 4) * 5 - 4 = 176

176是此控件可以具有的最小宽度。您可以覆盖CSS并删除间距,这将为您提供另外16个像素,因此最终会得到160像素。

显示打印最小尺寸的演示应用程序:

@Override
public void start(Stage primaryStage) throws Exception {
    final Rating rating = new Rating();

    final BorderPane pane = new BorderPane(rating);
    pane.setMaxWidth(Region.USE_PREF_SIZE);

    primaryStage.setScene(new Scene(pane));
    primaryStage.show();

    Platform.runLater(()->System.out.println(rating.getWidth()));

}

如果你真的想要删除间距,只需添加以下CSS规则:

.rating > .container {
    -fx-spacing: 0;
}