javafx打印对话框显示在Mac上,但不显示在Windows上

时间:2018-04-25 14:06:45

标签: javafx printing

我在我的一个项目上实现了Javafx PrinterJob来打印一些节点。 当我在我的Mac上运行它时,一切都按预期工作,但当我将jar文件复制到我的Windows机器并在那里运行时,应用程序运行良好,但打印对话框没有显示。

这是我的NodePrinter类

public class NodePrinter {

static PrinterJob job;

public static void print(VBox node, int numberOfPages) {
    job = PrinterJob.createPrinterJob();
    if (job != null && job.showPrintDialog(node.getScene().getWindow())) {
        Printer printer = job.getPrinter();
        PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM);

        AnchorPane root;

        for (int i = 0; i < numberOfPages; i++) {
            root = (AnchorPane) node.getChildren().get(0);
            start(root, pageLayout);
            node.getChildren().remove(root);
        }

        job.endJob();
    }

}

public static boolean start(AnchorPane root, PageLayout pageLayout) {

    double printableWidth = pageLayout.getPrintableWidth();
    double printableHeight = pageLayout.getPrintableHeight();

    double width = root.getWidth();
    double height = root.getHeight();

    if (width > printableWidth) {
        root.setMaxWidth(printableWidth);
    } else if(width < printableWidth) {
        root.setMinWidth(printableWidth);
    }

        double scaleX = 0.95;

        double scaleY;
        if (height + 100 > printableHeight) {
            if (height > 1100) {
                scaleY = printableHeight/ (height + 200);
            } else {
                scaleY = printableHeight/ (height + 100);
            }
        } else {
            scaleY = 1;
        }

        Scale scale = new Scale(scaleX, scaleY);

        root.getTransforms().add(scale);
        boolean success = job.printPage(pageLayout, root);
        root.getTransforms().remove(scale);
        return success;
    }
}

我像这样使用它

    Stage window = App.getPreloaderWindow();
    App.dataPreloader.start(window);

    Task<Void> printTask = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            this.updateMessage("Starting the Printer Job...");
            NodePrinter.print((VBox) root.lookup("#printView"), 4);

            return null;
        }
    };

    // binds progress of progress bars to progress of task:
    dataPreloader.activateProgressBar(printTask);

    printTask.setOnSucceeded(e -> {
        window.close();
    });
    Thread thread = new Thread(printTask);
    thread.start();

在Mac上,代码运行良好,我得到了打印对话框。它的屏幕截图如下所示:

Print dialog showing on Mac

但在Windows上,任务永远不会完成,我的预加载器会无限期显示。

修改

我最终将项目导出为zip文件并将其导回到Windows上,从那里构建并打印对话框。但是,当我从netbeans ide中运行分发jar时,打印对话框不再起作用了。

我对这种行为感到非常困惑。

1 个答案:

答案 0 :(得分:0)

这只是Java FX部署中netbeans中的文件依赖性问题

请看这个,看看为什么它在发行版上失败了。

FYI JAVAFX将在不久的将来从Java版本中删除。因此,请确保将整个.jar添加为依赖项。 Video of why it fails