我的Scene
设置为我的primaryStage的Scene
,其中包括VBox
和TableView
以及一些按钮。当我使用TableRow.snapshot(null, null)
对表格中的行创建快照时,Scene
的大小会发生变化。宽度改变了大约10个像素,而高度改变了大约40个 - 有时大于600(!) - 像素。
这是因为Node.snapshot(null, null)
调用Scene.doCSSLayoutSyncForSnapshot(Node node)
,它似乎获得了大小中所有节点的首选大小,并使用它重新计算大小。这会以某种方式返回错误的值,因为我的节点只指定了首选大小,并且在调用此方法之前看起来很棒。有什么方法可以阻止这种情况吗?
尺寸变化是一个问题,但是主要阶段不会改变它所包含的Scene
的尺寸也是一个问题。
我试图创建一个MCVE来重现这个问题,但是在尝试这几天之后,我仍然无法重现这个问题。原始程序包含大约2000行代码,我不想在这里发布。
为什么Scene.doCSSLayoutSyncForSnapshot(Node node)
在首先正确布局时会影响我的布局?在调用此方法之前,我可以以某种方式确保布局已正确同步,以确保它不会更改任何内容吗?
答案 0 :(得分:1)
解决了这个问题。不得不复制我的整个项目,然后删除部分代码,直到问题消失。
反正。我的应用程序中基本上有三个组件。导航组件,表组件和状态栏组件。它看起来像这样:
我遇到的问题是,每当我拍摄表格中某一行的快照时,状态栏的宽度以及表格组件的宽度和高度都会增加。
显然,这是由于状态栏组件的填充。它有一个5像素的左右填充,一旦我删除了填充,问题就消失了。
添加的10个像素的宽度使BorderPane
包含所有这些扩展,具有相同的像素数量,并且由于表格宽度绑定到BorderPane
宽度,因此增加了相同的宽度量。但我仍然不明白的是,包含Stage
的{{1}}不适应新宽度的原因。
在调用BorderPane
之前,组件已正确填充,因此我不明白为什么要添加十个像素的额外宽度。
无论如何:从状态栏组件中删除填充,而不是填充状态栏内的组件来解决问题。如果有人对此有一个很好的解释,我会全力以赴。
这是一个MCVE,您可以通过在表格中拖动一行来重现问题:
Scene.doCSSLayoutSyncForSnapshot(Node node)