这是4个具有不同填充的按钮的示例,它们会删除填充值的舍入。
第一个按钮:(3,6,4,6)第二个按钮:(2.5,6,4.5,6)第3个按钮:(2,6,5,6)第4个按钮:(2.4,6,4.6,6)
我期望某种抗锯齿能够产生错觉,即文本放在像素之间。
可以避免这种舍入吗?如果没有,那么填充值的目的是什么?
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。所有都有相同的填充。
第二个按钮按预期模糊,因为它位于中像素位置,但似乎文本由于某种原因仅由整数值转换。也许文本仅限于整数翻译,以确保它始终清晰(可读)且不会过度模糊。
答案 0 :(得分:0)
虽然Inset()
的参数是双倍的,但没有这样的东西只是方便。例如,您可能在循环内部和/或通过数学运算到达这些坐标,JavaFX使您无需自己进行舍入。最终坐标必须映射到像素 - 当然是整数的地址,因此舍入。如果您的屏幕分辨率为1400 x 1050,那么这些只是您协调的像素。
对于抗锯齿,您可以在Scene(Parent root, double width, double height, boolean depthBuffer, SceneAntialiasing antiAliasing).