JavaFX:如果节点边界设置为最大值,如何拍摄节点快照?

Posted

技术标签:

【中文标题】JavaFX:如果节点边界设置为最大值,如何拍摄节点快照?【英文标题】:JavaFX: How to take a node snapshot if the node bounds are set to maximum values? 【发布时间】:2020-08-25 14:02:46 【问题描述】:

我正在尝试拍摄自定义窗格的快照(我将其放置在 BorderPane 的中心),但每次我得到的是一张空白的 PNG 图像。我用一个按钮尝试了相同的代码,它的快照被成功拍摄并保存。我检查了边界,我注意到窗格的边界具有最大值(父边界和本地边界):

[minX:-9.9999997952E10, minY:-9.9999997952E10, minZ:0.0, width:1.99999995904E11, height:1.99999995904E11, depth:0.0, maxX:9.9999997952E10, maxY:9.9999997952E10, maxZ:0.0]

我认为原因是窗格的布局设置为填充 BorderPane 的中心空间。我还在支持我怀疑的文档中找到了following:

窗格的最大宽度和高度没有限制,这向父级表明它可以调整到超出其首选大小以填充分配给它的任何空间。

这是拍摄快照的相关代码:

final WritableImage SNAPSHOT = mNodeToExport.snapshot(new SnapshotParameters(), null);
final File          FILE     = new File(mPathTextField.getText());

try 
    ImageIO.write(SwingFXUtils.fromFXImage(SNAPSHOT, null), "png", FILE);
    return FILE;
 catch (IOException exception) 
    System.err.println("Error while exporting image of logicboard: " + exception.getMessage());
    return null;

创建快照后的内容是: debugging image 我认为这很奇怪,因为它的宽度和高度值应该远大于 1。

我已经尝试拍摄我要导出的窗格的子节点的快照,它对于具有“非无限”边界的子节点工作正常,但对于具有“无限”的界限。

如果由于“无限”绑定值而未正确拍摄快照,我如何临时更改快照的窗格边界?如果边界不是问题,那么问题可能是什么?

【问题讨论】:

【参考方案1】:

您显然可以传递用作快照视口的 Rectangle2D。所以下面的工作:

SnapshotParameters params = new SnapshotParameters();
params.setViewport(mLogicBoardView.getViewPort());
final WritableImage SNAPSHOT = mLogicBoardView.snapshot(params, null);
final File          FILE     = new File(mPathTextField.getText());

try 
    ImageIO.write(SwingFXUtils.fromFXImage(SNAPSHOT, null), "png", FILE);
    return FILE;
 catch (IOException exception) 
    System.err.println("Error while exporting image of logicboard: " + exception.getMessage());
    return null;


我在 getViewPort() 函数中手动计算视口。

【讨论】:

以上是关于JavaFX:如果节点边界设置为最大值,如何拍摄节点快照?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX - 垂直居中TextFlow中的文本

二叉树上节点间的最大距离

JavaFX 入门

树视图控件,从最大值获取下一个可用节点名

Javafx 可检索的拖放错误

如何解决Linux下USB设备节点名不固定问题