JavaFX PrinterJob mit mehreren Seiten

BOBmoraine

Neues Mitglied
Moin,
ich möchte eine FXML(Vorlage) laden, diese mit Daten befüllen und dann drucken.
Das klappt leider nicht 100%ig und ich hatte gehofft jemand hat einen Rat für mich.
Java:
<AnchorPane id="AnchorPane" fx:id="master" maxHeight="570.0" maxWidth="800.0" minHeight="570.0" minWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <VBox fx:id="page" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: rgb(247, 248, 249);" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox fx:id="header" prefHeight="50.0" prefWidth="600.0">
               <children>
                  <Label id="label_title" fx:id="label_title" alignment="BASELINE_CENTER" prefHeight="50.0" prefWidth="800.0" text="Titel">
                     <font>
                        <Font name="System Bold" size="24.0" />
                     </font>
                  </Label>
               </children>
            </HBox>
            <VBox fx:id="content" prefHeight="500.0" prefWidth="800.0">
               <children>
                  <TableView id="table_content" fx:id="table_content" prefHeight="500.0" prefWidth="800.0" VBox.vgrow="NEVER" />
               </children>
            </VBox>
            <HBox fx:id="footer" alignment="CENTER_RIGHT" prefHeight="20.0" prefWidth="800.0" spacing="20.0">
               <children>
                  <Label id="label_date" fx:id="label_date" text="Stand: dd.mm.yyyy" />
                  <Label id="label_page" fx:id="label_page" text="Seite n / n" />
               </children>
               <padding>
                  <Insets left="5.0" right="5.0" />
               </padding>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
Das ist meine FXML-Vorlage, erstellt mit dem SceneBuilder.

Java:
package de.onlinewartungsplaner.jowp.printing;

import de.onlinewartungsplaner.jowp.JOWP;
import de.onlinewartungsplaner.jowp.viewmodel.vmMaterial;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.print.JobSettings;
import javafx.print.PageLayout;
import javafx.print.PageOrientation;
import javafx.print.Paper;
import javafx.print.Printer;
import javafx.print.PrinterJob;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javafx.scene.transform.Scale;

/**
 *
 * @author BOBmoraine
 */
public class Printing {
    final JOWP importMainClass = JOWP.getInstance();
    private PageOrientation format = null;
    private final ObservableList list;
    private AnchorPane report;
    private int pagesSum = 1; //Anzahl Seiten gesammt
    private PrinterJob printerJob;
    private JobSettings jobSettings;
    private Printer printer;
    private PageLayout pageLayout;
    private int entrysPerPage = 8; //Einträge pro Seite
   
    /**
     * Rahmenbedingungen für Druckauftrag einstellen
     * @param List Gesammtliste der zu druckenden Daten
     * @param PageOrientation Ausrichtung der Seite
     * @param rowsPerPage Anzahl der Dateneinträge pro Seite
     */
    public Printing(ObservableList List, PageOrientation PageOrientation, int rowsPerPage){
        this.list = FXCollections.observableArrayList(List);
        this.format = PageOrientation;
        this.entrysPerPage = rowsPerPage;     
       
        double zwischenwert = Math.ceil(list.size()/(double)this.entrysPerPage);
        pagesSum = (int)zwischenwert;
       
        // Erstellung des Druck-Jobs
        printerJob = PrinterJob.createPrinterJob();
        jobSettings = printerJob.getJobSettings();
        printer = Printer.getDefaultPrinter();
        pageLayout = printer.createPageLayout(Paper.A4, this.format, Printer.MarginType.HARDWARE_MINIMUM);
   jobSettings.setPageLayout(pageLayout);
    }
   
    /**
     * Drucken
     */
    public void start(){
        if(list.size()>=1){
            //Druckauswahl öffnen und daten verarbeiten
            if (printerJob.showPrintDialog(importMainClass.getPrimaryStage().getOwner())){
                formatPrintingData();
                printerJob.endJob();
                }
            }
    }
   
    /**
     * Nodes in Vorlage mit Daten füllen
     */
    private void formatPrintingData() {
        if(list.get(0) instanceof vmMaterial ){
            FXMLLoader loader = new FXMLLoader(getClass().getResource("FXML_A4_Landscape.fxml"));
                try {
                    report = null;
                    report = (AnchorPane) loader.load();
                    //TODO report.getStylesheets().add(getClass().getResource("printing/FXML_A4_Landscape.css").toExternalForm());
                    }
                catch (IOException e) {
                        e.printStackTrace();
                    }
            Label title = (Label) report.lookup("#label_title");
            title.setText("Überschrift");
           
            //footer-daten einstellen
            Label date = (Label) report.lookup("#label_date");
            SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY);
            String output = formatter.format(new Date());
            date.setText("Druckdatum: " + output);

            Label page = (Label) report.lookup("#label_page");

            ObservableList<PrintingTableDataStorage> listOfTableData = FXCollections.observableArrayList(); //list for table
           
            //seiten durchlaufen
            for(int i = 1; i<= pagesSum; i++){
                listOfTableData.clear();
               
                //seitendaten durchlaufen
                for(int iD = i*entrysPerPage-entrysPerPage; iD<i*entrysPerPage; iD++){
                    if(iD<list.size()){
                        vmMaterial rowEntry = (vmMaterial)list.get(iD);
                        listOfTableData.add(new PrintingTableDataStorage(rowEntry.getMaterialStatusName(), rowEntry.getMaterialItemNameForSummary(), rowEntry.getMaterialNotiz()));
                       
                        //Testausgabe, alle Daten werden Seitenweise richtig übergeben
                        System.out.println(rowEntry.getMaterialID() + "::" + rowEntry.getMaterialItemNameForSummary());
                    }
                }
               
                TableView<PrintingTableDataStorage> table = (TableView) report.lookup("#table_content");
                table.getColumns().clear();
                table.setItems(listOfTableData);
                table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
               
                TableColumn column01 = new TableColumn();
                column01.setMaxWidth((report.getMinWidth()-3)/3);
                column01.setMinWidth((report.getMinWidth()-3)/3);
                column01.setText("Status");
                column01.setCellValueFactory(new PropertyValueFactory<>("column01Data"));

                TableColumn column02 = new TableColumn();
                column02.setMaxWidth((report.getMinWidth()-3)/3);
                column02.setMinWidth((report.getMinWidth()-3)/3);
                column02.setText("Summary");
                column02.setCellValueFactory(new PropertyValueFactory<>("column02Data"));
               
                TableColumn column03 = new TableColumn();
                column03.setMaxWidth((report.getMinWidth()-3)/3);
                column03.setMinWidth((report.getMinWidth()-3)/3);
                column03.setText("Notiz");
                column03.setCellValueFactory(new PropertyValueFactory<>("column03Data"));
                table.getColumns().addAll(column01, column02, column03);
               
                page.setText("Seiten " + i + "/" + pagesSum);
       
                //vorlage skalieren
                double scaleX = pageLayout.getPrintableWidth() / report.getMinWidth();
                double scaleY = pageLayout.getPrintableHeight() / report.getMinHeight();
                report.getTransforms().add(new Scale(scaleX, scaleY));
               
                waitForDone(report);
            }
        }
    }
   
    /**
     * PrintPage
     * @param reportIn Node to print
     */
    public synchronized void waitForDone(AnchorPane reportIn) {
        try {
            boolean jobDone = printerJob.printPage(reportIn);
            while (!jobDone) {
                wait();
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Das ist meine Druck-Klasse. Diese soll Vorlage entsprechend dem Datentyp und der übergebenen Ausrichtung laden und drucken.
Der erstellte Druckauftrag hat dann auch wie gewünscht die entsprechende Anzahl Seiten und dies mit der entsprechenden Vorlage.
Allerdings wird nur Seite 1 korrekt bearbeitet.
Seite 2 und alle weiteren werden nicht skaliert auf das Druckformat.
Und wenn ich einen Auftrag mit z.B. 25 Listeneinträgen übergebe, ist Seite 2 leer (allerdings nur die Datenzeilen der Tabelle, die Überschriften sind vorhanden), obwohl die Daten korrekt in die Tabelle eingefügt wurden.

Gibt es da einen Trick um mehrseitig zu drucken?

Java:
//listOfMaterial eine Liste mit 25 Einträgen
Printing newPrinting = new Printing(listOfMaterial, PageOrientation.LANDSCAPE, 10);
        newPrinting.start();
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J AWT Abfangen der Rohdaten die PrinterJob zum Drucker sendet AWT, Swing, JavaFX & SWT 2
T Klasse Printerjob AWT, Swing, JavaFX & SWT 26
C PrinterJob Englisch AWT, Swing, JavaFX & SWT 5
G Ikonli in Fat-Jar mit mehreren Icon-Packs einbinden AWT, Swing, JavaFX & SWT 5
F Zeile in mehreren Jtables bei Selektion markieren AWT, Swing, JavaFX & SWT 11
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
P JavaFx - Progressbar - Füllen mittels mehreren Tasks AWT, Swing, JavaFX & SWT 0
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
N Taschenrechner mit mehreren Rechnungen AWT, Swing, JavaFX & SWT 18
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
T JavaFX Label mit mehreren Images AWT, Swing, JavaFX & SWT 11
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
K Swing Keine Reaktion auf Tastatureingaben bei mehreren Buttons??? AWT, Swing, JavaFX & SWT 4
M Swing MVC mit mehreren Klassen AWT, Swing, JavaFX & SWT 2
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
K Swing Klassenstruktur mit mehreren JPanels AWT, Swing, JavaFX & SWT 3
M Applikation mit mehreren Scenes AWT, Swing, JavaFX & SWT 5
F Swing JAVA GUI Übergabe von Werten zwischen mehreren Fenstern/Klassen AWT, Swing, JavaFX & SWT 10
A JButton - Klicks zählen auf mehreren Buttons AWT, Swing, JavaFX & SWT 2
J Mit mehreren in Objekten in JFrame printen? AWT, Swing, JavaFX & SWT 8
P Liste mit Icons und mehreren Spalten AWT, Swing, JavaFX & SWT 7
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
S Shape erstellen der aus mehreren Elementen besteht..? AWT, Swing, JavaFX & SWT 3
F Tablemodel zu mehreren Tabellen AWT, Swing, JavaFX & SWT 6
T Sichtbarmachen von Objekten auf mehreren JPanels AWT, Swing, JavaFX & SWT 2
DamienX Swing Component auf mehreren Containern AWT, Swing, JavaFX & SWT 2
B Swing JFormattedTextField auf mehreren JPanels in einer JTabbedPane AWT, Swing, JavaFX & SWT 3
M In Jlist auf Änderungen von mehreren JLabels reagieren AWT, Swing, JavaFX & SWT 3
E JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 14
B SWT SWT Tree mit mehreren Spalten AWT, Swing, JavaFX & SWT 3
W GUI in mehreren Threads AWT, Swing, JavaFX & SWT 5
J Swing JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 4
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G Verliere Referenz von Toolbar bei mehreren Fenster AWT, Swing, JavaFX & SWT 3
M MVC: Grundidee verstanden aber was machen mit mehreren Model AWT, Swing, JavaFX & SWT 2
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
G JDialog mit mehreren Elementen! AWT, Swing, JavaFX & SWT 5
G Ein Frame mit mehreren austauschbaren Panels AWT, Swing, JavaFX & SWT 3
S JTable audrucken, aber mit mehreren Footers und Headers AWT, Swing, JavaFX & SWT 2
O Zwischen mehreren Bildern wechseln AWT, Swing, JavaFX & SWT 6
S Enter in JLabel - oder: JTabbedPane mit mehreren JLabel AWT, Swing, JavaFX & SWT 3
I Arbeiten mit mehreren Fenstern AWT, Swing, JavaFX & SWT 4
H jar-archive mit mehreren Klassen erstellen AWT, Swing, JavaFX & SWT 3
G Organisation Anwendung mit mehreren Eingabedialogen AWT, Swing, JavaFX & SWT 3
L Probleme mit mehreren Canvas: Überlagerungseffekte? AWT, Swing, JavaFX & SWT 5
N JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 21
Q Auf mehreren JPanels Bilder zeichnen. AWT, Swing, JavaFX & SWT 5
T Swing: MainForm mit mehreren Tabs AWT, Swing, JavaFX & SWT 6
K Spaltenbreite von mehreren Tabellen gleichzeitig verändern AWT, Swing, JavaFX & SWT 3
H JTable Text aus mehreren Zellen in einer Spalte kopieren? AWT, Swing, JavaFX & SWT 3
R Navigieren zwischen mehreren Fenstern AWT, Swing, JavaFX & SWT 7
U Anwendung mit mehreren "Fenstern" AWT, Swing, JavaFX & SWT 4
M JDialog mit mehreren Eingabenfeldern? AWT, Swing, JavaFX & SWT 5
M jtabbedpane mit mehreren layoutmanagern? AWT, Swing, JavaFX & SWT 2
V Werte mehreren Checkboxes zuweisen AWT, Swing, JavaFX & SWT 3
T JList mit mehreren spalten AWT, Swing, JavaFX & SWT 2
M Mit mehreren Panels arbeiten AWT, Swing, JavaFX & SWT 2
A JFrame mit mehreren Panels AWT, Swing, JavaFX & SWT 10
P JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 15
V JTable mit mehreren Componenten in einer Spalte ? AWT, Swing, JavaFX & SWT 6
M Dialog mit mehreren Komponenten AWT, Swing, JavaFX & SWT 4
N Checkbox mit mehreren Strings belegen? AWT, Swing, JavaFX & SWT 6
MiMa BorderPane Seiten ein und ausblenden? AWT, Swing, JavaFX & SWT 16
I Scene Builder - mehrere Seiten AWT, Swing, JavaFX & SWT 6
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
G JavaFX Slider in JavaFX beide Seiten beschriften AWT, Swing, JavaFX & SWT 2
M "(Buch-)Seiten" erstellen AWT, Swing, JavaFX & SWT 2
M Swing JSplitPane beide Seiten fixieren AWT, Swing, JavaFX & SWT 2
T Ein Seiten Resisable AWT, Swing, JavaFX & SWT 5
G Komplexe HTML-Seiten mit Swing Browsen AWT, Swing, JavaFX & SWT 5
A Seiten für freie LookAndFeels AWT, Swing, JavaFX & SWT 3
I JEditorPane vorladen der Seiten unterbinden AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben