我到目前为止有什么
我试图用javaFx实现一个多行的javaFx,它能够显示表情符号,我使用了VBox of FlowPanes (每一行都有一个FlowPane ),用空格分隔成文字,单词显示在HBox中,HBox将包含文本的文本节点和表情符号的ImageView,当前的设置在下面的图像中描述。

下面的截图显示了我到目前为止的情况。

问题所在
我所面临的问题是复杂的单词,当多个表情符号(ImageViews)显示在一个HBox中时,卡雷特位置估计将对每幅图像错误半像素(因为我假设HBox的宽度将等于其子HBox的fitWidths之和?,但它不是),就好像HBox有某种间距,尽管间距属性设置为0。
如果同时显示许多表情符号,效果会变得更糟,如下面的屏幕截图所示


它也不是填充,或边界,任何帮助都会感谢,我很抱歉,对冗长乏味的解释,我不得不加上它,如果它可以帮助我解决这个问题。
发布于 2021-07-24 23:02:23
经过大量调查,结果发现这是由于我将子fitWidth的ImageViews设置为十进制值(非整数),ImageView接受一个双值作为fitWidth,但在呈现时它似乎是四舍五入到最近的大整数,调用getFitWidth()方法仍然会返回您设置的双值,但是父方法会用四舍五入的值显示它们(因为我猜物理像素不能显示半像素,对吗?)
因此,只有当getWidth() ( ImageViews的fitWidths )是非整数的情况下,才会返回比子ImageViews 的fitWidths之和更大的值。
这可以使用下面的代码进行测试
ArrayList<Image> images = new ArrayList<Image>();
//Fill the list with N images
StackPane root = new StackPane();
root.setPadding(new Insets(15));
HBox parent = new HBox(0);
for (Image image : images) {
ImageView view = new ImageView(image);
view.setPreserveRatio(true);
view.setFitWidth(fitWidth);
parent.getChildren().add(view);
}
root.getChildren().add(parent);
ps.setOnShown(event -> {
double sum = 0;
for (Node node : parent.getChildren()) {
sum += ((ImageView) node).getFitWidth();
}
System.out.println("fitWidth : " + fitWidth);
System.out.println("Sum of fitWidths of child ImageViews : " + sum);
System.out.println("Width of the parent HBox : " + parent.getWidth());
});
ps.setScene(new Scene(root));
ps.show();在fitWidth为31.5和32.0的情况下运行此程序将得到以下结果
fitWidth : 31.5
Sum of fitWidths of child ImageViews : 315.0
Width of the parent HBox : 320.0
fitWidth : 32.0
Sum of fitWidths of child ImageViews : 320.0
Width of the parent HBox : 320.0注意,父级的宽度是相同的,但是fitWidths的和不是,因为在布局或呈现过程中,值是在某个点舍入的,这导致了问题中所描述的问题。
解决这个问题会因上下文而异,我通过在设置fitWidth时将double转换为int来解决这个问题,但这确实取决于开发人员。
https://stackoverflow.com/questions/68512753
复制相似问题