2D-Grafik Problem beim Drucken eines Grafik-Objekts

darkwall

Aktives Mitglied
Hallo liebes Java-Forum,

ich habe ein Problem beim Drucken von Grafik-Objekten.
Folgende Aufgabe: Eine ArrayList<String> mit Textzeilen soll ausgedruckt werden. Eine Textzeile besteht aus mehreren Informationen, die durch ### getrennt sind. Die erste Info ist immer der Typ der Zeile (es gibt 7-8 verschiedene Typen, die sich in Fettdruck, Schriftgröße, Tabelle usw. unterscheiden).

Mein Versuche (s.u.) generiert auch schon Seiten mit den Zeilen (bisher habe ich nur die Tabellenzeilen getestet, ist auch das Komplizierteste). Es sollten zwei Seiten mit je 50 Zeilen sein, von 0 bis 99. Das Ergebnis sieht jedoch so aus, dass die erste Seite einfach ein zweites Mal angehängt wird.
Ich habe in der Javadoc von Printable gelesen, dass die Methode print() eine Seite mehrmals aufrufen kann. Ich denke hier liegt der Fehler, ich finde ihn aber nicht.
Javadoc von Printable: "The printing system may request a page index more than once. On each occasion equal PageFormat parameters will be supplied."

Kann mir jemand helfen? Danke im Voraus!
Darkwall


Hier der Code. Ist eine einzige Datei, die ich mit Netbeans erstellt habe und die so lauffähig ist.
Java:
package drucken;

import java.awt.Graphics;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.JOptionPane;

public class DruckerTest {

    private ArrayList<String> inhalt;
    private PrinterJob pjob;
    int zeilenAbstand = 10;
    int sizeHeading1 = 18;
    int sizeHeading2 = 14;
    int sizeSubtext = 12;
    int sizeDefault = 12;
    int sizeCopyright = 8;
    int sizeLicence = 8;
    int sizePrinttime = 8;

    int paddingLeft = 2;    
    
    private Font headerfont1 = new Font("Arial", Font.BOLD, sizeHeading1);
    private Font headerfont2 = new Font("Arial", Font.BOLD, sizeHeading2);
    private Font subtextfont = new Font("Arial", Font.PLAIN, sizeSubtext);
    private Font textfont = new Font("Arial", Font.PLAIN, sizeDefault);
    private Font copyrightfont = new Font("Arial", Font.PLAIN, sizeCopyright);
    private Font licencefont = new Font("Arial", Font.PLAIN, sizeLicence);
    private Font printtimefont = new Font("Arial", Font.PLAIN, sizePrinttime);

    double paperWidth = 8.26; // Breite in inch
    double paperHeight = 11.69; // Höhe in inch
    double leftMargin = 0.6; // 0.3 in --> 0.762 cm
    double rightMargin = 0.6;
    double topMargin = 0.6;
    double bottomMargin = 0.6;

    int letzteZeile = 0;

    public int getLetzteZeile() {
        return letzteZeile;
    }

    public void setLetzteZeile(int letzteZeile) {
        this.letzteZeile = letzteZeile;
    }
    
    
    
    private int counter = 0;

    private int[] spaltenbreiten;
    
    public static void main(String[] args) {

        // Beispiel Spaltenbreiten in %
        int[] spaltenbreiten = new int[5];
        spaltenbreiten[0] = 20;
        spaltenbreiten[1] = 10;
        spaltenbreiten[2] = 10;
        spaltenbreiten[3] = 20;
        spaltenbreiten[4] = 40;
        new DruckerTest(spaltenbreiten);
    }

    public DruckerTest(int[] spaltenbreiten) {

        this.spaltenbreiten = spaltenbreiten;
        inhalt = new ArrayList<String>();
        
        // Das Array inhalt wird mit 100 Beispielzeilen gefüllt.
        // Die Zellinhalte werden mit ### getrennt.
        // In der ersten Zelle steht der Typ der Zeile, hier: def
        for (int i = 0; i < 100; i++) {            
            String test = "def###Zeile: " + i+"###Zeläögggle2###Zelle3###Zelgggle4###Zelle5";
            System.out.println(test);
            inhalt.add(test);
        }
        
        try {
            getPrinter();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Keine Verbindung zum Drucker", "Fehler", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }

    
    private void getPrinter() throws PrinterException {
        System.out.println("GET PRINTER");
        pjob = PrinterJob.getPrinterJob();

        Paper a4Paper = new Paper();
        PageFormat pf = new PageFormat();

        a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0);
        a4Paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0,
                (paperWidth - leftMargin - rightMargin) * 72.0,
                (paperHeight - topMargin - bottomMargin) * 72.0);
        
        pf.setPaper(a4Paper);
        System.out.println("+++ PAGESIZE  : Höhe: "+ (paperHeight) * 72.0 + " Breite: "+(paperWidth) * 72.0);        
        System.out.println("+++ PAGEFORMAT: Höhe="+pf.getImageableHeight()+" Breite="+pf.getImageableWidth());

        Book book = new Book();

        ArrayList<String> temp = new ArrayList<String>();
        setLetzteZeile(0);
        counter = 0;
        int i = 0;
        int anzZeilen = 0;
        
        ArrayList<TextPrintable> tpList = new ArrayList<TextPrintable>();
        
        while(i < inhalt.size() && getLetzteZeile() <= inhalt.size()){
            // berechne, wie viele Zeilen auf eine Seite passen
            anzZeilen = berechneAnzahlZeilen(inhalt, pf);
            
            // erstelle eine ArrayList mit den zu druckenden Zeilen der Seite
            i = getLetzteZeile();
            while(i < getLetzteZeile()+anzZeilen && inhalt.get(i) != null){                
                System.out.println("--- Füge hinzu: "+inhalt.get(i));
                temp.add(inhalt.get(i));
                i++;
            }
            System.out.println("--- Setze letzte Zeile: "+(getLetzteZeile()+anzZeilen));
            setLetzteZeile(getLetzteZeile()+anzZeilen);
            
            // Füge die Seite in die ArrayList der Seiten ein
            tpList.add(new TextPrintable(temp));
            
        }

        // Füge alle Seiten dem book-Objekt hinzu
        for (int j = 0; j < tpList.size(); j++) {
            System.out.println("+++ hänge Seite an: "+j);
            book.append(tpList.get(j), pf);            
        }

        pjob.setPageable(book);  
    
        if (pjob.printDialog()) {
            try {
                pjob.print();
            } catch (Exception PrintException) {
                PrintException.printStackTrace();
            }
        } else {
            System.out.println("Printing aborted...");
        }
    }

    private int berechneAnzahlZeilen(ArrayList<String> inhalt, PageFormat pf) {
        int i = getLetzteZeile();
        int sumHeight = 0;
        int zeilenAnzahl = 0;
        
        System.out.println("### berechneAnzahlZeilen ab: "+i+" ImageableHeight="+pf.getImageableHeight());        
        
        // Je nach Typ wird die Zeilenhöhe aufsummiert (wegen des obigen Beispiels ist
        // nur der letzte Fall (DEF) relevant
        while(i < inhalt.size() && sumHeight < pf.getImageableHeight()) { // 40 --> Puffer
            if(i < inhalt.size()){
            System.out.println("### UNTERSUCHE: "+inhalt.get(i).split("###")[0]+" i="+i);
            if(inhalt.get(i).split("###")[0].equalsIgnoreCase("h1")){
                System.out.println("### H1 ###");
                sumHeight += 22;
            } else if(inhalt.get(i).split("###")[0].equalsIgnoreCase("h2")){
                System.out.println("### H2 ###");
                sumHeight += 17;
            } else if(inhalt.get(i).split("###")[0].equalsIgnoreCase("sub")){
                System.out.println("### SUB ###");
                sumHeight += 15;
            } else if(inhalt.get(i).split("###")[0].equalsIgnoreCase("copy")){
                System.out.println("### COPY ###");
                sumHeight += 10;            
            } else if(inhalt.get(i).split("###")[0].equalsIgnoreCase("print")){
                System.out.println("### PRINT ###");
                sumHeight += 10;
            } else if(inhalt.get(i).split("###")[0].equalsIgnoreCase("licence")){
                System.out.println("### LICENCE ###");
                sumHeight += 10;
            } else {
                System.out.println("### DEF ###");
                sumHeight += 15;
            }
            zeilenAnzahl++;
            i++;
            }
        }
        if(sumHeight >= pf.getImageableHeight())
            zeilenAnzahl -= 1;
        System.out.println("### Zeilenanzahl: "+zeilenAnzahl+" Höhe: "+sumHeight);
        return zeilenAnzahl;
    }

    int lastPageIndex = 0;
    
    class TextPrintable implements Printable {
        
        int[] spaltenbreitenPixel;
        FontMetrics fm;
        ArrayList<String> list;

        public TextPrintable(ArrayList<String> list) {
            System.out.println("TEXTPRINTABLE");            
            this.list = list;
        }

        public int print(Graphics g, PageFormat pageFormat, int pageIndex) {

            System.out.println("PAINT Seite: "+pageIndex + " Lastpageindex="+lastPageIndex);
         
            setLetzteZeile(0);
            spaltenbreitenPixel = prozent2pixel(pageFormat, spaltenbreiten);
            
            // Startkoordinaten auf Seite
            int x = (int) pageFormat.getImageableX();            
            int y = (int) pageFormat.getImageableY();

            // Rechteck nur zum sehen, wo gedruckt werden kann:
            g.drawRect(x, y, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight());            
            
            System.out.println("Startkoordinaten X="+x+" Y="+y);
            
            // Schleife, die alle Zeilen des Arrays zeichnet:
            for (int i = 0; i < list.size(); i++) {
                System.out.println("### Zeichne Zeile: "+(getLetzteZeile()+i) + " ###");                
                y += makeRow(list.get(i), g, x, y);                
            }
            
            return Printable.PAGE_EXISTS;
        }
        
        private int makeRow(String zeile, Graphics g, int x, int y){

            // Die Zeilen werden je nach Typ gezeichnet.            
            String[] temp = zeile.split("###");
            
            if(temp[0].equalsIgnoreCase("h1")){                
                
                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();                
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                g.drawString(zeile, x, y);
                
            } else if(temp[0].equalsIgnoreCase("h2")){                

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                g.drawString(zeile, x, y);                
                
            } else if(temp[0].equalsIgnoreCase("sub")){

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                g.drawString(zeile, x, y);                
                                
            } else if(temp[0].equalsIgnoreCase("copy")){

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                x = (int) pjob.defaultPage().getImageableWidth()/2 - (int)fm.stringWidth(temp[0])/2;
                g.drawString(zeile, x, y);                
                
            } else if(temp[0].equalsIgnoreCase("print")){

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                x = (int) pjob.defaultPage().getImageableWidth()/2 - (int)fm.stringWidth(temp[0])/2;
                g.drawString(zeile, x, y);                               
                
            } else if(temp[0].equalsIgnoreCase("licence")){
                
                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                x = (int) pjob.defaultPage().getImageableWidth()/2 - (int)fm.stringWidth(temp[0])/2;
                g.drawString(zeile, x, y);                
                
            } else {
                
                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                makeTableRow(g, zeile, x, y);                
                
            }
        return fm.getHeight();
    }   
        
        
        private Font getFont(String rowType){            
            if(rowType.equalsIgnoreCase("h1")){                
                return headerfont1;
            } else if(rowType.equalsIgnoreCase("h2")){                
                return headerfont2;
            } else if(rowType.equalsIgnoreCase("sub")){
                return subtextfont;
            } else if(rowType.equalsIgnoreCase("copy")){
                return copyrightfont;           
            } else if(rowType.equalsIgnoreCase("print")){
                return printtimefont;
            } else if(rowType.equalsIgnoreCase("licence")){
                return licencefont;
            } else {
                return textfont;
            }
        }
        
        /**
         * Diese Methode verkürzt den übergebenen String, wenn er länger als die spaltenbreite ist.
         * @param ttemp - zu kürzender String
         * @param fm - FontMetrics
         * @param spaltenbreite - die Spaltenbreite
         * @return gekürzter String
         */        
        private String verkuerzeString (String ttemp, FontMetrics fm, int spaltenbreite) {
            
            String ttemp2 = ttemp;
            if(fm.stringWidth(ttemp) >= spaltenbreite){
                // String verkürzen
                int b = 0;
                do {
                    ttemp2 = ttemp.substring(0, ttemp.length() - b).trim() + "...";
                    b++;
                } while (fm.stringWidth(ttemp2) >= spaltenbreite);
                }
            ttemp = ttemp2;
            return ttemp;
        }
        
        /**
         * Diese Methode zeichnet eine Tabellenzeile.
         * @param g - Graphics
         * @param zeile - die Zeile
         * @param x - x-Koordinate
         * @param y - y-Koordinate 
         */
        private void makeTableRow(Graphics g, String zeile, int x, int y) {
            
            String[] temp = zeile.split("###");            
            System.out.println("### ERSTELLE TABELLENZEILE: "+zeile+" temp="+temp.length);            
//            g.setFont(getFont(temp[0]));
//            System.out.println("Schriftart für Tabellenzeile: " + g.getFont().getFamily());
//            fm = g.getFontMetrics();
            for(int i = 1; i < temp.length; i++){
                System.out.println("RECHTECK: x="+x+" y="+y+" b="+spaltenbreitenPixel[i-1]+" h="+fm.getHeight()+" Text: "+temp[i]);
                //y = y - fm.getAscent()-fm.getDescent();
                g.drawRect(x, y-fm.getHeight()+fm.getLeading()+fm.getDescent()+1, spaltenbreitenPixel[i-1], fm.getHeight());
                g.drawString(verkuerzeString(temp[i], fm, spaltenbreitenPixel[i-1]-paddingLeft), x+paddingLeft, y);
                x += spaltenbreitenPixel[i-1];
            }            
        }

        /**
         * Diese Methode wandelt die spaltenbreiten gegeben in % in die Pixel
         * der aktuellen ImageableWidth um.
         * @param pf - PageFormat
         * @param spaltenbreiten - Array mit den Spaltenbreiten in %
         * @return Array mit den Spaltenbreiten in Pixeln
         */
        private int[] prozent2pixel(PageFormat pf, int[] spaltenbreiten){
            int[] pixels = new int[spaltenbreiten.length];
            int sum = 0;
            for(int i = 0; i < spaltenbreiten.length; i++){
                pixels[i] = (int) Math.ceil((pf.getImageableWidth()-leftMargin*72)*1.0*spaltenbreiten[i]*1.0/100.0);
                System.out.print(pixels[i]+" ");
                sum += pixels[i];
            }
            
            // Rundungsfehler beheben
            int diff = sum - (int) pf.getImageableWidth();
            if(diff > 0)
                pixels[pixels.length-1] -= diff;
            
            System.out.println("");
            System.out.println("SUMME: "+(sum-diff)+ " BREITE GESAMT: "+pf.getImageableWidth());
            return pixels;
        }        
    }
}
 

André Uhres

Top Contributor
Hallo Darkwall,

du kannst ja den pageIndex abfragen und dann nur das drucken, was auf die jeweilige Seite kommen soll, etwa so:

Java:
int start = 0;
int limit = 50;
if(pageIndex == 1){
    start = 50;
    limit = list.size();
}
// Schleife, die alle Zeilen des Arrays zeichnet:
for (int i = start; i < limit; i++) {
    System.out.println("### Zeichne Zeile: " + (getLetzteZeile() + i) + " ###");
    y += makeRow(list.get(i), g, x, y);
}

Gruß,
André
 

darkwall

Aktives Mitglied
Hi André,

danke für den Tipp! Hat auch zunächst geholen, dann -- beim Verallgemeinern -- ist mir aber der eigentliche Fehler aufgefallen: Die ArrayList temp wurde nicht wieder zurückgesetzt, somit waren zu viele Zeilen zu zeichen, was die Probleme ergab.

Viele Grüße und vielen Dank! :toll:
Darkwall


Ich poste hier nochmal die korrekte Version, falls es jemanden interessiert:
Java:
package drucken;

import java.awt.Graphics;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.JOptionPane;

public class DruckerTest {

    private ArrayList<String> inhalt;
    private PrinterJob pjob;
    int zeilenAbstand = 10;
    int sizeHeading1 = 18;
    int sizeHeading2 = 14;
    int sizeSubtext = 12;
    int sizeDefault = 12;
    int sizeCopyright = 8;
    int sizeLicence = 8;
    int sizePrinttime = 8;
    int paddingLeft = 2;
    private Font headerfont1 = new Font("Arial", Font.BOLD, sizeHeading1);
    private Font headerfont2 = new Font("Arial", Font.BOLD, sizeHeading2);
    private Font subtextfont = new Font("Arial", Font.PLAIN, sizeSubtext);
    private Font textfont = new Font("Arial", Font.PLAIN, sizeDefault);
    private Font copyrightfont = new Font("Arial", Font.PLAIN, sizeCopyright);
    private Font licencefont = new Font("Arial", Font.PLAIN, sizeLicence);
    private Font printtimefont = new Font("Arial", Font.PLAIN, sizePrinttime);
    double paperWidth = 8.26; // Breite in inch
    double paperHeight = 11.69; // Höhe in inch
    double leftMargin = 0.6; // 0.3 in --> 0.762 cm
    double rightMargin = 0.6;
    double topMargin = 0.6;
    double bottomMargin = 0.6;
    int letzteZeile = 0;

    public int getLetzteZeile() {
        return letzteZeile;
    }

    public void setLetzteZeile(int letzteZeile) {
        this.letzteZeile = letzteZeile;
    }
    private int counter = 0;
    private int[] spaltenbreiten;

    public static void main(String[] args) {

        // Beispiel Spaltenbreiten in %
        int[] spaltenbreiten = new int[5];
        spaltenbreiten[0] = 20;
        spaltenbreiten[1] = 10;
        spaltenbreiten[2] = 10;
        spaltenbreiten[3] = 20;
        spaltenbreiten[4] = 40;
        new DruckerTest(spaltenbreiten);
    }

    public DruckerTest(int[] spaltenbreiten) {

        this.spaltenbreiten = spaltenbreiten;
        inhalt = new ArrayList<String>();

        // Das Array inhalt wird mit 100 Beispielzeilen gefüllt.
        // Die Zellinhalte werden mit ### getrennt.
        // In der ersten Zelle steht der Typ der Zeile, hier: def
        for (int i = 0; i < 120; i++) {
            String test = "def###Zeile: " + i + "###Zeläögggle2###Zelle3###Zelgggle4###Zelle5";
            System.out.println(test);
            inhalt.add(test);
        }

        try {
            getPrinter();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Keine Verbindung zum Drucker", "Fehler", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }

    private void getPrinter() throws PrinterException {
        System.out.println("GET PRINTER");
        pjob = PrinterJob.getPrinterJob();

        Paper a4Paper = new Paper();
        PageFormat pf = new PageFormat();

        a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0);
        a4Paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0,
                (paperWidth - leftMargin - rightMargin) * 72.0,
                (paperHeight - topMargin - bottomMargin) * 72.0);

        pf.setPaper(a4Paper);
        System.out.println("+++ PAGESIZE  : Höhe: " + (paperHeight) * 72.0 + " Breite: " + (paperWidth) * 72.0);
        System.out.println("+++ PAGEFORMAT: Höhe=" + pf.getImageableHeight() + " Breite=" + pf.getImageableWidth());

        Book book = new Book();

        ArrayList<String> temp = new ArrayList<String>();
        setLetzteZeile(0);
        counter = 0;
        int i = 0;
        int anzZeilen = 0;

        ArrayList<TextPrintable> tpList = new ArrayList<TextPrintable>();

        while (i < inhalt.size() && getLetzteZeile() <= inhalt.size()) {
            // berechne, wie viele Zeilen auf eine Seite passen
            anzZeilen = berechneAnzahlZeilen(inhalt, pf);
            temp = new ArrayList<String>();

            // erstelle eine ArrayList mit den zu druckenden Zeilen der Seite
            i = getLetzteZeile();
            while (i < getLetzteZeile() + anzZeilen && inhalt.get(i) != null) {
                System.out.println("--- Füge hinzu: " + inhalt.get(i));
                temp.add(inhalt.get(i));
                i++;
            }
            System.out.println("--- Setze letzte Zeile: " + (getLetzteZeile() + anzZeilen));
            setLetzteZeile(getLetzteZeile() + anzZeilen);

            // Füge die Seite in die ArrayList der Seiten ein
            tpList.add(new TextPrintable(temp));

        }

        // Füge alle Seiten dem book-Objekt hinzu
        for (int j = 0; j < tpList.size(); j++) {
            System.out.println("+++ hänge Seite an: " + j);
            book.append(tpList.get(j), pf);
        }

        pjob.setPageable(book);

        if (pjob.printDialog()) {
            try {
                pjob.print();
            } catch (Exception PrintException) {
                PrintException.printStackTrace();
            }
        } else {
            System.out.println("Printing aborted...");
        }
    }

    private int berechneAnzahlZeilen(ArrayList<String> inhalt, PageFormat pf) {
        int i = getLetzteZeile();
        int sumHeight = 0;
        int zeilenAnzahl = 0;

        System.out.println("### berechneAnzahlZeilen ab: " + i + " ImageableHeight=" + pf.getImageableHeight());

        // Je nach Typ wird die Zeilenhöhe aufsummiert (wegen des obigen Beispiels ist
        // nur der letzte Fall (DEF) relevant
        while (i < inhalt.size() && sumHeight < pf.getImageableHeight()) { // 40 --> Puffer
            if (i < inhalt.size()) {
                System.out.println("### UNTERSUCHE: " + inhalt.get(i).split("###")[0] + " i=" + i);
                if (inhalt.get(i).split("###")[0].equalsIgnoreCase("h1")) {
                    System.out.println("### H1 ###");
                    sumHeight += 22;
                } else if (inhalt.get(i).split("###")[0].equalsIgnoreCase("h2")) {
                    System.out.println("### H2 ###");
                    sumHeight += 17;
                } else if (inhalt.get(i).split("###")[0].equalsIgnoreCase("sub")) {
                    System.out.println("### SUB ###");
                    sumHeight += 15;
                } else if (inhalt.get(i).split("###")[0].equalsIgnoreCase("copy")) {
                    System.out.println("### COPY ###");
                    sumHeight += 10;
                } else if (inhalt.get(i).split("###")[0].equalsIgnoreCase("print")) {
                    System.out.println("### PRINT ###");
                    sumHeight += 10;
                } else if (inhalt.get(i).split("###")[0].equalsIgnoreCase("licence")) {
                    System.out.println("### LICENCE ###");
                    sumHeight += 10;
                } else {
                    System.out.println("### DEF ###");
                    sumHeight += 15;
                }
                zeilenAnzahl++;
                i++;
            }
        }
        if (sumHeight >= pf.getImageableHeight()) {
            zeilenAnzahl -= 1;
        }
        System.out.println("### Zeilenanzahl: " + zeilenAnzahl + " Höhe: " + sumHeight);
        return zeilenAnzahl;
    }
    int lastPageIndex = 0;

    class TextPrintable implements Printable {

        int[] spaltenbreitenPixel;
        FontMetrics fm;
        ArrayList<String> list;

        public TextPrintable(ArrayList<String> list) {
            System.out.println("TEXTPRINTABLE: "+list.size());
            this.list = list;
        }

        public int print(Graphics g, PageFormat pageFormat, int pageIndex) {

            System.out.println("PAINT Seite: " + pageIndex + " Lastpageindex=" + lastPageIndex);


            setLetzteZeile(0);
            spaltenbreitenPixel = prozent2pixel(pageFormat, spaltenbreiten);

            // Startkoordinaten auf Seite
            int x = (int) pageFormat.getImageableX();
            int y = (int) pageFormat.getImageableY();

            // Rechteck nur zum sehen, wo gedruckt werden kann:
            g.drawRect(x, y, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight());

            System.out.println("Startkoordinaten X=" + x + " Y=" + y);

            // Schleife, die alle Zeilen des Arrays zeichnet:
            for (int i = 0; i < list.size(); i++) {
                System.out.println("### Zeichne Zeile: " + (getLetzteZeile() + i) + " ###");
                y += makeRow(list.get(i), g, x, y);
            }

            return Printable.PAGE_EXISTS;

        }

        private int makeRow(String zeile, Graphics g, int x, int y) {

            // Die Zeilen werden je nach Typ gezeichnet.            
            String[] temp = zeile.split("###");

            if (temp[0].equalsIgnoreCase("h1")) {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                g.drawString(zeile, x, y);

            } else if (temp[0].equalsIgnoreCase("h2")) {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                g.drawString(zeile, x, y);

            } else if (temp[0].equalsIgnoreCase("sub")) {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                g.drawString(zeile, x, y);

            } else if (temp[0].equalsIgnoreCase("copy")) {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                x = (int) pjob.defaultPage().getImageableWidth() / 2 - (int) fm.stringWidth(temp[0]) / 2;
                g.drawString(zeile, x, y);

            } else if (temp[0].equalsIgnoreCase("print")) {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                x = (int) pjob.defaultPage().getImageableWidth() / 2 - (int) fm.stringWidth(temp[0]) / 2;
                g.drawString(zeile, x, y);

            } else if (temp[0].equalsIgnoreCase("licence")) {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                x = (int) pjob.defaultPage().getImageableWidth() / 2 - (int) fm.stringWidth(temp[0]) / 2;
                g.drawString(zeile, x, y);

            } else {

                g.setFont(getFont(temp[0]));
                fm = g.getFontMetrics();
                y += fm.getAscent() + fm.getDescent() - fm.getLeading();
                makeTableRow(g, zeile, x, y);

            }
            return fm.getHeight();
        }

        private Font getFont(String rowType) {
            if (rowType.equalsIgnoreCase("h1")) {
                return headerfont1;
            } else if (rowType.equalsIgnoreCase("h2")) {
                return headerfont2;
            } else if (rowType.equalsIgnoreCase("sub")) {
                return subtextfont;
            } else if (rowType.equalsIgnoreCase("copy")) {
                return copyrightfont;
            } else if (rowType.equalsIgnoreCase("print")) {
                return printtimefont;
            } else if (rowType.equalsIgnoreCase("licence")) {
                return licencefont;
            } else {
                return textfont;
            }
        }

        /**
         * Diese Methode verkürzt den übergebenen String, wenn er länger als die spaltenbreite ist.
         * @param ttemp - zu kürzender String
         * @param fm - FontMetrics
         * @param spaltenbreite - die Spaltenbreite
         * @return gekürzter String
         */
        private String verkuerzeString(String ttemp, FontMetrics fm, int spaltenbreite) {

            String ttemp2 = ttemp;
            if (fm.stringWidth(ttemp) >= spaltenbreite) {
                // String verkürzen
                int b = 0;
                do {
                    ttemp2 = ttemp.substring(0, ttemp.length() - b).trim() + "...";
                    b++;
                } while (fm.stringWidth(ttemp2) >= spaltenbreite);
            }
            ttemp = ttemp2;
            return ttemp;
        }

        /**
         * Diese Methode zeichnet eine Tabellenzeile.
         * @param g - Graphics
         * @param zeile - die Zeile
         * @param x - x-Koordinate
         * @param y - y-Koordinate 
         */
        private void makeTableRow(Graphics g, String zeile, int x, int y) {

            String[] temp = zeile.split("###");
            System.out.println("### ERSTELLE TABELLENZEILE: " + zeile + " temp=" + temp.length);
//            g.setFont(getFont(temp[0]));
//            System.out.println("Schriftart für Tabellenzeile: " + g.getFont().getFamily());
//            fm = g.getFontMetrics();
            for (int i = 1; i < temp.length; i++) {
                System.out.println("RECHTECK: x=" + x + " y=" + y + " b=" + spaltenbreitenPixel[i - 1] + " h=" + fm.getHeight() + " Text: " + temp[i]);
                //y = y - fm.getAscent()-fm.getDescent();
                g.drawRect(x, y - fm.getHeight() + fm.getLeading() + fm.getDescent() + 1, spaltenbreitenPixel[i - 1], fm.getHeight());
                g.drawString(verkuerzeString(temp[i], fm, spaltenbreitenPixel[i - 1] - paddingLeft), x + paddingLeft, y);
                x += spaltenbreitenPixel[i - 1];
            }
        }

        /**
         * Diese Methode wandelt die spaltenbreiten gegeben in % in die Pixel
         * der aktuellen ImageableWidth um.
         * @param pf - PageFormat
         * @param spaltenbreiten - Array mit den Spaltenbreiten in %
         * @return Array mit den Spaltenbreiten in Pixeln
         */
        private int[] prozent2pixel(PageFormat pf, int[] spaltenbreiten) {
            int[] pixels = new int[spaltenbreiten.length];
            int sum = 0;
            for (int i = 0; i < spaltenbreiten.length; i++) {
                pixels[i] = (int) Math.ceil((pf.getImageableWidth() - leftMargin * 72) * 1.0 * spaltenbreiten[i] * 1.0 / 100.0);
                System.out.print(pixels[i] + " ");
                sum += pixels[i];
            }

            // Rundungsfehler beheben
            int diff = sum - (int) pf.getImageableWidth();
            if (diff > 0) {
                pixels[pixels.length - 1] -= diff;
            }

            System.out.println("");
            System.out.println("SUMME: " + (sum - diff) + " BREITE GESAMT: " + pf.getImageableWidth());
            return pixels;
        }
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem mit der Seiteneinrichtung beim Drucken AWT, Swing, JavaFX & SWT 7
Y Problem beim Drucken AWT, Swing, JavaFX & SWT 2
V Problem beim drucken AWT, Swing, JavaFX & SWT 4
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
A Swing Problem beim Neuerstellen einer Node AWT, Swing, JavaFX & SWT 4
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
K Swing Problem beim Zeichnen von Kreisen AWT, Swing, JavaFX & SWT 4
K JButton Problem beim Schriftfarbe Ändern AWT, Swing, JavaFX & SWT 2
P Problem beim erstellen eines JPanel in einem JFrame AWT, Swing, JavaFX & SWT 7
R Problem beim Anzeigen von Bildern auf JInternalFrame AWT, Swing, JavaFX & SWT 6
M Problem beim Eventhandling AWT, Swing, JavaFX & SWT 5
B Problem beim laden von Bild mit getResource() AWT, Swing, JavaFX & SWT 3
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
M Problem beim Zeichnen mit Path2D AWT, Swing, JavaFX & SWT 4
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
G Problem beim setzen des Fokus AWT, Swing, JavaFX & SWT 4
Z Problem beim JTextField AWT, Swing, JavaFX & SWT 5
C Swing Problem beim 2. Öffnen eines JFrames AWT, Swing, JavaFX & SWT 9
1 Java.awt.Robot Problem beim Shift-Druck AWT, Swing, JavaFX & SWT 5
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
F Problem beim Positionieren von Icon und Text in Button AWT, Swing, JavaFX & SWT 2
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
N SWT Einfaches Problem beim Layout AWT, Swing, JavaFX & SWT 8
N Swing Problem beim Einlesen von Jtable in Array AWT, Swing, JavaFX & SWT 5
W Swing Problem beim Passwort Dialog AWT, Swing, JavaFX & SWT 4
C Problem mit Swing Application Framework - Projekt beim AWT, Swing, JavaFX & SWT 2
F kleines problem beim suchen in einem String AWT, Swing, JavaFX & SWT 15
A Problem beim Setzen von JPanels AWT, Swing, JavaFX & SWT 4
P Problem beim Linien ziehen! AWT, Swing, JavaFX & SWT 12
S Problem beim Anpassen vom GridBagLayout AWT, Swing, JavaFX & SWT 10
H Adressbuch - Problem beim Speichern der Eingabe AWT, Swing, JavaFX & SWT 5
P Bug in Java? - Problem beim Ändern von Spaltentiteln AWT, Swing, JavaFX & SWT 2
I Layout Problem beim Skalieren AWT, Swing, JavaFX & SWT 3
S Problem beim implementerien von ActionListener AWT, Swing, JavaFX & SWT 4
A Problem beim Import! AWT, Swing, JavaFX & SWT 2
M Problem beim Einsatz von ScrollPane (Fenster spielt verrückt AWT, Swing, JavaFX & SWT 2
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
W Problem beim neuzeichnen eines Rechteckes (SWT) AWT, Swing, JavaFX & SWT 2
J Problem beim Multi-Threading mit einem JDialog AWT, Swing, JavaFX & SWT 2
J Problem mit Alpha-Wert beim Button AWT, Swing, JavaFX & SWT 3
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
F Problem mit geänderten AttributSet beim StyledDocument AWT, Swing, JavaFX & SWT 4
B BorderLayout/JSplitPane Problem beim Ausrichten AWT, Swing, JavaFX & SWT 5
C Problem beim Ausführen von Thread per Button AWT, Swing, JavaFX & SWT 2
S Problem beim Image laden AWT, Swing, JavaFX & SWT 4
D Problem beim Erstellen eines GridBagLayouts AWT, Swing, JavaFX & SWT 3
A Problem beim Neuzeichnen AWT, Swing, JavaFX & SWT 2
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
S Problem beim Umbenennen von MP3s AWT, Swing, JavaFX & SWT 10
O Problem beim Umwandeln eines Applets in eine Applikation AWT, Swing, JavaFX & SWT 15
T Problem beim Laden von Bildern AWT, Swing, JavaFX & SWT 14
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben