我在我的一个项目上实现了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上,代码运行良好,我得到了打印对话框。它的屏幕截图如下所示:
但在Windows上,任务永远不会完成,我的预加载器会无限期显示。
修改
我最终将项目导出为zip文件并将其导回到Windows上,从那里构建并打印对话框。但是,当我从netbeans ide中运行分发jar时,打印对话框不再起作用了。
我对这种行为感到非常困惑。
答案 0 :(得分:0)
这只是Java FX部署中netbeans中的文件依赖性问题
请看这个,看看为什么它在发行版上失败了。
FYI JAVAFX将在不久的将来从Java版本中删除。因此,请确保将整个.jar添加为依赖项。 Video of why it fails