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

问题描述 投票:0回答:1

我试图对一个自定义窗格(我把它放在BorderPane的中心)进行快照,但每次得到的都是一个空白的PNG图片。我试着用一个按钮来做同样的代码,结果快照被成功拍摄并保存。我检查了bounds,我注意到pane的bounds有最大值(包括parent的bounds和local的bounds)。

[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的中心空间。我还发现 下面 文件中的这段话支持了我的猜测。

一个窗格的最大宽度和高度不受限制 这是对父节点的一个指示 它的大小可能会被调整到超过它的首选尺寸 以填补分配给它的任何空间。

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

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;
}

创建快照后的内容是:调试图像 我觉得很奇怪,因为它的宽度和高度值应该远远大于1。

我试过对我要导出的窗格的子节点进行快照,对于具有 "非无限 "约束的子节点,快照工作正常,但对于具有 "无限 "约束的子节点,却返回相同的图像。

如果因为 "无限 "边界值的原因导致快照不能正常拍摄,如何临时改变窗格的快照边界?如果边界不是问题,那么问题可能出在哪里?

javafx snapshot bounds
1个回答
0
投票

显然,你可以传递一个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()函数中手动计算了视口。

© www.soinside.com 2019 - 2024. All rights reserved.