JavaFX中填充的十进制值四舍五入为整数。为什么?

时间:2015-05-26 00:31:24

标签: javafx

这是4个具有不同填充的按钮的示例,它们会删除填充值的舍入。

第一个按钮:(3,6,4,6)第二个按钮:(2.5,6,4.5,6)第3个按钮:(2,6,5,6)第4个按钮:(2.4,6,4.6,6)

enter image description here

我期望某种抗锯齿能够产生错觉,即文本放在像素之间。

可以避免这种舍入吗?如果没有,那么填充值的目的是什么?

public class ButtonTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        StackPane root = new StackPane();
        HBox hBox = new HBox();
        hBox.setAlignment(Pos.CENTER);

        Button firstButton = new Button("Text");
        Button secondButton = new Button("Text");
        Button thirdButton = new Button("Text");
        Button fourthButton = new Button("Text");

        Insets firstPadding = new Insets(3, 6, 4, 6);
        Insets secondPadding = new Insets(2.5, 6, 4.5, 6);
        Insets thirdPadding = new Insets(2, 6, 5, 6);
        Insets fourthPadding = new Insets(2.4, 6, 4.6, 6);

        firstButton.setPadding(firstPadding);
        secondButton.setPadding(secondPadding);
        thirdButton.setPadding(thirdPadding);
        fourthButton.setPadding(fourthPadding);

        firstButton.setTooltip(new Tooltip(firstPadding.toString()));
        secondButton.setTooltip(new Tooltip(secondPadding.toString()));
        thirdButton.setTooltip(new Tooltip(thirdPadding.toString()));
        fourthButton.setTooltip(new Tooltip(fourthPadding.toString()));

        hBox.getChildren().add(firstButton);
        hBox.getChildren().add(secondButton);
        hBox.getChildren().add(thirdButton);
        hBox.getChildren().add(fourthButton);
        root.getChildren().add(hBox);

        Scene scene = new Scene(root, 300, 200);
        scene.getStylesheets().add("test.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

}

CSS:

.button {
    -fx-snap-to-pixel: false;
}


更新

奇怪的是:如果按钮沿Y轴平移0.5或-0.5,则移动按钮但文本保持不变。

第一个按钮未翻译,第二个按钮翻译为-0.5,第三个按钮翻译为-1。所有都有相同的填充。

enter image description here

第二个按钮按预期模糊,因为它位于中像素位置,但似乎文本由于某种原因仅由整数值转换。也许文本仅限于整数翻译,以确保它始终清晰(可读)且不会过度模糊。

1 个答案:

答案 0 :(得分:0)

虽然Inset()的参数是双倍的,但没有这样的东西只是方便。例如,您可能在循环内部和/或通过数学运算到达这些坐标,JavaFX使您无需自己进行舍入。最终坐标必须映射到像素 - 当然是整数的地址,因此舍入。如果您的屏幕分辨率为1400 x 1050,那么这些只是您协调的像素。

对于抗锯齿,您可以在Scene(Parent root, double width, double height, boolean depthBuffer, SceneAntialiasing antiAliasing).

中定义scene时进行设置