0

在流程窗格中,我有几个拆分窗格并将拆分窗格作为节点移交给打印功能。第一个拆分窗格打印在 A4 面朝上,大约半页后在后续页面上打印任何拆分窗格。注意:拆分窗格具有可变高度。但是,即使所有拆分窗格都相同,这仍然有效。

设置打印机对话框显式 A4 纵向格式,不会更改。场景调整大小没有帮助。

调用顺序如下:

容器控制器.java

       @FXML
private void handlePrint(ActionEvent event) {
    try {
        FXPrinter fxPrinter = new FXPrinter();
        for (Object split : flowPane.getChildren()) {
            Node node = null;
            node = (Node) split;
            fxPrinter.printFX(getPrimaryStage(), node);
        }
    } catch (IOException ex) {
        Logger.getLogger(ContainerController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

公共类 FXPrinter { ...

public void printFX(Stage primaryStage, Node node) {
    Printer printer = Printer.getDefaultPrinter();
    PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);
    double scaleX = pageLayout.getPrintableWidth() / node.getBoundsInParent().getWidth();
    double scaleY = pageLayout.getPrintableHeight() / node.getBoundsInParent().getHeight();
    PrinterJob job = PrinterJob.createPrinterJob(printer);
    job.getJobSettings().setPageLayout(pageLayout);
    if (scaleY < 1.0) {
        // more then one page
        if (scaleY < scaleX) {
            // more than one page, we must take Y stretchfactor 
            node.getTransforms().add(new Scale(scaleX, scaleY));
        } else {
            // take X stretchfactor for Y for proportional both, X/Y stretching
            node.getTransforms().add(new Scale(scaleX, scaleX));
        }
    } else {
        // less then one page, set x proportional to y, equal stretchfactor
        node.getTransforms().add(new Scale(scaleX, scaleX));
    }
    if (job != null) {
        if (job.showPrintDialog(primaryStage.getOwner()) && job.printPage(pageLayout, node)) {
            job.endJob();
        }
    }
}

永远感谢您的支持 Gerhard Laib

4

1 回答 1

0

在其他地方,我发现了以下注释:

一个节点在场景图中的任何地方最多可能出现一次。具体来说,一个节点必须在以下所有情况中出现不超过一次:作为场景的根节点、父节点的子 ObservableList 或节点的剪辑。

...

如果程序将子节点添加到父节点(包括组、区域等)并且该节点已经是不同父节点的子节点或场景的根节点,则该节点会自动(并且无声地)从其前父节点中删除。

...

可以重新排列场景图的结构,例如,将子树从场景图中的一个位置移动到另一个位置。为了做到这一点,通常会在将子树插入新位置之前从其旧位置删除子树。但是,如果应用程序没有显式删除子树,则会如上所述自动删除子树。

这是我的解决方案,效果很好:

    @FXML
private void handlePrint(ActionEvent event) {
    try {
        FXPrinter fxPrinter = new FXPrinter();
        int size = flowPane.getChildren().size();
        for (int i = 0; i < size; i++) {
            Node node = (Node) flowPane.getChildren().get(0);
            fxPrinter.print(getPrimaryStage(), node);
            flowPane.getChildren().remove(0);
        }
        // reload 
        loadSplitPanes();
    } catch (IOException ex) {
        Logger.getLogger(ContainerController.class.getName()).log(Level.SEVERE, null, ex);
    }
}
于 2015-05-20T12:55:57.020 回答