我试图对一个自定义窗格(我把它放在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。
我试过对我要导出的窗格的子节点进行快照,对于具有 "非无限 "约束的子节点,快照工作正常,但对于具有 "无限 "约束的子节点,却返回相同的图像。
如果因为 "无限 "边界值的原因导致快照不能正常拍摄,如何临时改变窗格的快照边界?如果边界不是问题,那么问题可能出在哪里?
显然,你可以传递一个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()函数中手动计算了视口。