Я реализовал 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 эта задача никогда не завершается, и мой предварительный загрузчик отображается бесконечно.
Edit:
Я наконец-то экспортировал проект в виде zip-файла и импортировал его обратно в окна, построенные оттуда, и диалог печати заработал. Но когда я запускаю дистрибутивный jar из netbeans ide, диалоговое окно печати больше не работает.
Я очень запутался в этом поведении.