Printing 打印流程窗格中的拆分窗格从下半页打印
在一个流程窗格中,我有几个拆分窗格,并将拆分窗格作为节点移交给打印功能。 第一个splitpane打印在A4面朝上,接下来的页面上再打印大约半页。 注意:拆分窗格具有可变高度。 但是,即使所有拆分窗格都相同,也会发生这种情况 设置打印机对话框的A4纵向格式不变。 场景大小调整没有帮助 调用顺序如下: ContainerController.javaPrinting 打印流程窗格中的拆分窗格从下半页打印,printing,javafx,splitpane,flowpane,Printing,Javafx,Splitpane,Flowpane,在一个流程窗格中,我有几个拆分窗格,并将拆分窗格作为节点移交给打印功能。 第一个splitpane打印在A4面朝上,接下来的页面上再打印大约半页。 注意:拆分窗格具有可变高度。 但是,即使所有拆分窗格都相同,也会发生这种情况 设置打印机对话框的A4纵向格式不变。 场景大小调整没有帮助 调用顺序如下: ContainerController.java @FXML private void handlePrint(ActionEvent event) { try {
@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);
}
}
公共类打印机{
…
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();
}
}
}
public void printFX(Stage primaryStage,Node){
打印机打印机=打印机。getDefaultPrinter();
PageLayout PageLayout=printer.createPageLayout(Paper.A4,PageOrientation.肖像,printer.MarginType.DEFAULT);
double-scaleX=pageLayout.getPrintableWidth()/node.getBoundsInParent().getWidth();
double scaleY=pageLayout.getPrintableHeight()/node.getBoundsInParent().getHeight();
PrinterJob作业=PrinterJob.createPrinterJob(打印机);
job.getJobSettings().setPageLayout(pageLayout);
如果(scaleY<1.0){
//不止一页
if(scaleY
感谢你的支持
格哈德·莱布(Gerhard Laib)我在其他地方发现了以下注释:
@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);
}
}
节点在场景图中的任何位置最多只能出现一次。具体而言,节点在以下所有情况中只能出现一次:作为场景的根节点、父节点的子节点列表或节点的剪辑
如果程序将子节点添加到父节点(包括组、区域等),并且该节点已经是其他父节点的子节点或场景的根节点,则该节点将自动(静默)从其前父节点中移除
可以重新排列场景图的结构,例如,将子树从场景图中的一个位置移动到另一个位置。为此,通常会在将子树插入新位置之前将其从旧位置移除。但是,如果应用程序阳离子并没有明确地移除它
这是我的解决方案,效果非常好:
@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);
}
}
@FXML
私有无效handlePrint(ActionEvent事件){
试一试{
FXPrinter FXPrinter=新的FXPrinter();
int size=flowPane.getChildren().size();
对于(int i=0;i