диалоговое окно печати javafx отображается на Mac, но не на окна - PullRequest
0 голосов
/ 25 апреля 2018

Я реализовал 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 эта задача никогда не завершается, и мой предварительный загрузчик отображается бесконечно.

Edit:

Я наконец-то экспортировал проект в виде zip-файла и импортировал его обратно в окна, построенные оттуда, и диалог печати заработал. Но когда я запускаю дистрибутивный jar из netbeans ide, диалоговое окно печати больше не работает.

Я очень запутался в этом поведении.

1 Ответ

0 голосов
/ 07 мая 2018

Это просто проблема зависимости файлов в сетевых компонентах при развертывании Java FX

Пожалуйста, посмотрите это, чтобы понять, почему он не работает в дистрибутиве.

FYI JAVAFX будет удален из выпусков Java в ближайшем будущем. Поэтому убедитесь, что вы добавляете весь .jar в качестве зависимости. Видео о том, почему это не удается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...