提问者:小点点

JavaFX 8 - 打印 3D 场景


我正在尝试使用JavaFX 8打印API,当我尝试打印包含任何类型3D内容的任何场景/节点时,我遇到了问题。我一直在这里和其他网站上寻找答案,但没有找到任何帮助。

如果节点仅包含2D内容,场景将在我选择的打印机上打印,不会出现问题。但是如果我在场景中添加一个3D物体,整个东西就打印不出来了——没有任何错误,但是没有任何内容。如果我用打印机打印,会“打印”一张空白页,如果我用文档打印机打印,会得到一张空文档。

我尝试使用 AWT 打印机制将节点转换为可写图像,然后转换为缓冲图像进行打印。这在打印中起作用,但我们对从中获得的质量不满意。

在这个阶段,我的印刷电话是相当标准的-

private void doPrintFX() {
    Printer printer = Printer.getDefaultPrinter();
    PageLayout pageLayout = printer.createPageLayout(
            Paper.A3, PageOrientation.LANDSCAPE, Printer.MarginType.DEFAULT);

    final double scaleFactor = computeScaleFactor(pageLayout.getPrintableWidth(),
            pageLayout.getPrintableHeight(),
            sceneNode.getBoundsInParent().getWidth(),
            sceneNode.getBoundsInParent().getHeight());
    if (scaleFactor != 0) {
        sceneNode.getTransforms().add(new Scale(scaleFactor, scaleFactor));
    }

    PrinterJob job = PrinterJob.createPrinterJob(printer);
    if (job != null) {
        System.out.println("Printing to " + job.getPrinter().getName());
        boolean success = job.printPage(pageLayout, sceneNode);
        if (success) {
            job.endJob();
        }
    }
}

我已将节点缩小为一个非常简单的场景,其中包含几个矩形和一个圆柱体。我目前使用的代码是:

    Cylinder cylinder = new Cylinder(50, 150);
    cylinder.setLayoutX(250);
    cylinder.setLayoutY(100);
    canvas.getDrawingPane().getChildren().add(cylinder);

    Rectangle item = new Rectangle(50, 50, 100, 50);
    item.setStroke(Color.BLACK);
    item.setFill(null);
    canvas.getDrawingPane().getChildren().add(item);

    item = new Rectangle(75, 75, 100, 50);
    item.setStroke(Color.BLACK);
    item.setFill(null);
    canvas.getDrawingPane().getChildren().add(item);

canvas.getDrawingPane 是一个窗格,是发送到打印函数的内容。

有人能建议我正在做的事情可能有什么问题吗?JavaFX print API支持打印3D节点吗?谢谢你。


共1个答案

匿名用户

只是为其他可能感兴趣的人回答我自己的问题。

我发现FX 8不支持3D打印。它已被发布,以便对版本9进行可能的增强。