Drucken von variabel langen Listen (es kommen nur leere Seiten raus)

Tharsonius

Bekanntes Mitglied
Hallo zusammen,

ich habe ein Problem beim Drucken einer variabel langen Liste und komme einfach nicht mehr weiter.
Ich hoffe Ihr könnt mir diesbezüglich weiterhelfen.

Zuerst einen kurzen umriss des ganzen:
Ich habe in einer Datenbank Arbeitskarteneinträge hinterlegt (Mitarbeiter, Stückzahl, Zeit) und diese lese ich mit meinem Programm aus. Nun sollen bestimmte Arbeitskarten gedruckt werden.
Die Arbeitskarten sind auch nicht gleich lang, so dass der Druck ggf auf 2 Seiten erfolgen muss.

was bisher funktioniert:
Ich habe eine Klasse Arbeitskarte, die unter anderem die besagte Liste der Einträge auffängt (in form einer Liste).
Ich kann mir aus dieser Arbeitskarte die entsprechenden Elemente holen.
Java:
public final class Arbeitskarte
{ //Klasse ist gekürzt, das füllen der Liste ist weggelassen, funktioniert aber erwiesenermaßen
  private LinkedList<ArbeitskarteElement> liste;
  private int lastdone;

  public Arbeitskarte()
  {
    liste = new LinkedList<ArbeitskarteElement>();
    lastdone = -1;
  }
  public final ArbeitskarteElement getEintrag(int index)
  {
    return liste.get(index);
  }
  
  public final void setLastDone(int index)
  {
    lastdone = index;
  }
  
  public final int getLastDone()
  {
    return lastdone;
  }
  
  public final boolean isDone()
  {
    if((lastdone + 1) >= liste.size())
      return true;
    return false;
  }
}


Ich starte den Druckvorgang
Java:
      PrinterJob job = PrinterJob.getPrinterJob();
      PageFormat format = job.defaultPage();
      format.setOrientation(PageFormat.PORTRAIT);
      Paper paper = new Paper();
      paper.setSize(595.44, 841.68);  // Papierformat Din A4
      paper.setImageableArea(0, 0, 595.44, 841.68);
      format.setPaper(paper);
      job.setJobName("DokuSoft AP608FF Arbeitskarte");
      job.setCopies(1);
      job.setPrintable(new ArbeitskarteDruck(karte), format);
      job.print();

und habe dazu eine Klasse geschrieben, die das Interface Printable implementiert
Java:
public final class ArbeitskarteDruck
implements Printable
{
  private Arbeitskarte karte;
  
  public ArbeitskarteDruck(Arbeitskarte karte)
  {
    this.karte = karte;
  }
  
  public int print (java.awt.Graphics g, PageFormat f, int pageIndex)
  { // Diese Methode wurde stark gekürzt, um das Problem zu verdeutlichen
    if(karte.isDone() == true)
      return NO_SUCH_PAGE;
    g.setColor(Color.BLACK);
    g.drawRect(57, 28, 496, 777);
    g.drawLine(57, 119, 553, 119);
    g.setFont(new Font("Arial", Font.BOLD, 24));
    g.drawString("Arbeitskarte", 63, 53);
    int offset = 125;
    String platz;
    boolean pagedone = false;
    while(pagedone == false)
    {
      if((offset + 56) >= 755 || karte.isDone() == true)
      {
        pagedone = true;
        continue;
      }
      platz = karte.getEintrag(karte.getLastDone() + 1).getPlatz();
      g.setFont(new Font("Arial", Font.PLAIN, 12));
      g.drawString(platz, 71, (offset + 14));
      g.setFont(new Font("Courier New", Font.PLAIN, 12));
      int i = 0;
      boolean platzdone = false;
      while(karte.isDone() == false && (offset + ((i + 1) * 14) + 42) <= 755 && platzdone == false)
      {
        ArbeitskarteElement element = karte.getEintrag(karte.getLastDone() + 1);
        if(element.getPlatz().equals(platz) == false)
        {
          platzdone = true;
          continue;
        }
        i++;
        // An dieser Stelle wird vom element die entsprechenden Daten ausgegeben
      }
      offset = offset + (i * 14) + 42;
    }
    return PAGE_EXISTS;
  }
}

Auf dem Ausdruck soll das ganze dann Blockweise erscheinen, eine einmalige Überschrift und da drunter dann in Tabellenform alle Einträge. Der nächste Block wird dann eine andere Überschrift haben...

Grundgedanke ist dabei, dass eine Seite gefüllt wird und dabei mittels der Variablen lastdone der jeweils letzte
gedruckte Eintrag gemerkt wird. Wenn die Seite voll ist soll es dann auf der nächsten Seite weiter gehen.
Erst wenn alles gedruckt wurde soll abgebrochen werden, daher die Abfrage zu Beginn.


Mein Problem nun ist, dass der Druckvorgang auch initialisiert wird, das Blatt aber immer leer ist. (Bei 2 Seitigem Druck sind beide leer)
Anscheinend (ohne es genau zu wissen) wird print() zwar mehrfach aufgerufen und durchlaufen, erst nachdem aber alle Seiten fest stehen wird das ganze nochmal durchlaufen und gefüllt. Zumindest hat es den Anschein.


Ich habe nun irgendwie keinen Schimmer wie ich meine Liste mehrseitig ausdrucken kann, vorallem da ich leider nicht weiss wie lang die Liste ist, wie viele Blöcke es gibt und viel lang die Tabellen der einzelnen Blöcke sind.

Jemand eine Idee, wie ich das ganze abändern kann, damit das geht?
 
Zuletzt bearbeitet:

Tharsonius

Bekanntes Mitglied
Hallo zusammen,

nachdem ich nun einige Tage darüber gegrübelt, gesucht, verzweifelt und verschiedenste Sachen ausprobiert habe, habe ich heute nun endlich eine Lösung für das Problem gefunden.

Das Drucken läuft so ab, dass zuerst einmal print() aufgerufen wird, dabei wird die Seite aber nicht gefüllt. Es wird lediglich ermittelt ob die Seite überhaupt existiert. An dieser Stelle würde es also vollkommen ausreichen PAGE_EXISTS oder NO_SUCH_PAGE zurück zu geben.

Danach wird print() ein zweites mal aufgerufen. Nun wiederum ist der Rückgabewert vollkommen egal. Dieses mal wird die Seite selber gefüllt und alle Zeichenbefehle und Schreibbefehle zeigen volle Wirkung.

Erst anschließend wird der pageIndex hochgezählt und das ganze beginnt erneut.
Ein mehrseitiger Druck mit beispielsweise 3 Seiten hat insgesammt 7 Aufrufe der print() Methode.

Ich hoffe diese Information ist für irgendwen anders irgendwann mal interessant und erspart Euch den Ärger, den ich hatte ;-)

Wenn man dies nun einmal weiß, dann kann man auch eine Lösung zu meinem oben genannten Problem finden.
Alles in allem musste ich letztendlich nur noch eine kleine Änderung an der ArbeitskarteDruck Klasse vornehmen.

Diese sieht nun so aus:
Ich habe wiederum den eigentlichen Druckinhalt der Liste und des Listenkopfes entfernt. Auf Wunsch kann ich aber noch weiterführende Erklärungen geben. Einfach melden.
Java:
public final class ArbeitskarteDruck
implements Printable
{
  private Arbeitskarte karte;
  private int lastdone;
  private boolean again;
  
  public ArbeitskarteDruck(Arbeitskarte karte)
  {
    this.karte = karte;
    lastdone = -1;
    again = false;
  }
  
  public int print (java.awt.Graphics g, PageFormat f, int pageIndex)
  {
    // Start des eingefügten ersten Blocks
    if(again == true)
      karte.setLastDone(lastdone);
    else
      lastdone = karte.getLastDone();
    // Blockende
    if(karte.isDone() == true)
    {
      return NO_SUCH_PAGE;
    }
    g.setColor(Color.BLACK);
    g.drawRect(57, 28, 496, 777);
    g.drawLine(57, 119, 553, 119);
    g.setFont(new Font("Arial", Font.BOLD, 24));
    g.drawString("Arbeitskarte", 63, 53);
    int offset = 125;
    String platz;
    boolean pagedone = false;
    while(pagedone == false)
    {
      if((offset + 56) >= 755 || karte.isDone() == true)
      {
        pagedone = true;
        continue;
      }
      platz = karte.getEintrag(karte.getLastDone() + 1).getPlatz();
      g.setFont(new Font("Arial", Font.PLAIN, 12));
      g.drawString(platz, 71, (offset + 14));
      g.setFont(new Font("Courier New", Font.PLAIN, 12));
      int i = 0;
      boolean platzdone = false;
      while(karte.isDone() == false && (offset + ((i + 1) * 14) + 42) <= 755 && platzdone == false)
      {
        ArbeitskarteElement element = karte.getEintrag(karte.getLastDone() + 1);
        if(element.getPlatz().equals(platz) == false)
        {
          platzdone = true;
          continue;
        }
        i++;
        // Daten des Elements ausgeben an dieser Stelle
        karte.setLastDone(karte.getLastDone() + 1);
      }
      g.drawRect(69, (offset + 17), 472, ((i + 1) * 14));
      g.drawLine(69, (offset + 31), 541, (offset + 31));
      offset = offset + (i * 14) + 42;
    }
    // Eingefügter zweiter Block Start
    if(again == false)
      again = true;
    else
      again = false;
    // Block Ende
    return PAGE_EXISTS;
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Drucken / Druckserver Allgemeine Java-Themen 13
M Drucken drawString(); Allgemeine Java-Themen 1
M Drucken ohne Dialog Allgemeine Java-Themen 1
M Drucken von Dateien Allgemeine Java-Themen 10
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
T Drucken einer PDF Datei Allgemeine Java-Themen 4
S Input/Output Drucken Allgemeine Java-Themen 2
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
T Drucken von JPanel Allgemeine Java-Themen 4
F Mehrere JTables' drucken Allgemeine Java-Themen 0
B JTextArea 6 mal auf DinA4 Format verteilen und drucken Allgemeine Java-Themen 1
Androbin Drucken in Java - Größen- und Positionsprobleme Allgemeine Java-Themen 3
E Drucken einer Pdf Datei unter Java. Allgemeine Java-Themen 1
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
L Aktuell angezeigtes Drucken Allgemeine Java-Themen 8
Thallius Drucken mit Logo Allgemeine Java-Themen 2
Thallius Drucken mit Templates Allgemeine Java-Themen 3
S PDF-Generierung und Drucken Allgemeine Java-Themen 11
A Drucken auf theoretisch unendlich langer Seite Allgemeine Java-Themen 2
M Fehlende Zeichen beim Drucken mit PDFBox Allgemeine Java-Themen 10
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
B Drucken (Inhaltsverzeichnis usw.) Allgemeine Java-Themen 4
F Drucken von Escape-Sequenzen Allgemeine Java-Themen 11
H Drucken von Belegen (Belegdrucker: EPSON TM-T88III Allgemeine Java-Themen 2
W Input/Output Drucken ohne GUI Allgemeine Java-Themen 11
C PDF Dateien mit Java drucken Allgemeine Java-Themen 2
R PDF duplex drucken Allgemeine Java-Themen 3
A Drucken auf kleine Formate Allgemeine Java-Themen 2
sylo PageFormat - Das Problem mit dem Drucken Allgemeine Java-Themen 5
M Drucken hilfe Allgemeine Java-Themen 4
Y Drucken mit Java Allgemeine Java-Themen 2
M aus Datei drucken Allgemeine Java-Themen 5
M Problem beim Drucken von PDFs Allgemeine Java-Themen 3
A Drucken ändert aktuelles Verzeichnis Allgemeine Java-Themen 2
S Drucken ohne Rand Allgemeine Java-Themen 3
A Drucken einer JList Allgemeine Java-Themen 3
D pdf mit iText drucken Allgemeine Java-Themen 4
K SWT OpenOffcie Dokument drucken Allgemeine Java-Themen 8
V Drucken von Listen Allgemeine Java-Themen 6
J xls Datei drucken mit Java Allgemeine Java-Themen 10
A HTML-Seite aufrufen, drucken und zum Programm zurückkehren Allgemeine Java-Themen 2
J Drucken mit drawString() und Zeilenumbruch Allgemeine Java-Themen 3
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
P JTable drucken Allgemeine Java-Themen 8
U Dokumente als PDF "drucken" Allgemeine Java-Themen 3
T Drucken mit PrintJob und Einstellungen merken Allgemeine Java-Themen 3
O Mehrseitiges Drucken Allgemeine Java-Themen 5
V Datei Drucken Allgemeine Java-Themen 19
D Inhalt der JTextArea drucken Allgemeine Java-Themen 2
S Problem beim Drucken auf Netzwerkdrucker unter Linux Allgemeine Java-Themen 9
R Drucken über bestimmten Drucker Allgemeine Java-Themen 11
V Probleme beim Drucken mehrerer PDF's Allgemeine Java-Themen 17
Zed Tool zum drucken von Sourcecode Allgemeine Java-Themen 9
G diagramm drucken Allgemeine Java-Themen 3
J Drucken über Java oder OOo empfehlenswert? Allgemeine Java-Themen 15
W Drucken in Graustufen Allgemeine Java-Themen 4
F Frage zum Drucken Allgemeine Java-Themen 4
G Drucken einer GUI-Komponenter ? Allgemeine Java-Themen 4
Lazybone iText und Drucken Allgemeine Java-Themen 5
G Drucken mit Laserdrucker Allgemeine Java-Themen 5
Lazybone Rechnung erstellen und Drucken Allgemeine Java-Themen 19
G Drucken in Java Allgemeine Java-Themen 3
M Drucken Allgemeine Java-Themen 2
M Drucken Schacht auswählen/bestimmen Allgemeine Java-Themen 2
P Drucken Allgemeine Java-Themen 9
T OO zum drucken/convertieren ohne Socket Allgemeine Java-Themen 8
M Drucken mit BufferedImage Allgemeine Java-Themen 9
S hilfe für drucken Allgemeine Java-Themen 4
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
D Masken drucken Allgemeine Java-Themen 13
C von Java aus ein Dokument im Browser drucken Allgemeine Java-Themen 11
L Per IText erstelltes PDF automatisch drucken Allgemeine Java-Themen 13
G Drucken Allgemeine Java-Themen 9
L Rechnungen in Java erstellen & drucken Allgemeine Java-Themen 23
G iText: Problem beim Drucken von AcroFormen Allgemeine Java-Themen 2
André Uhres Drucken: Printer is not accepting job Allgemeine Java-Themen 3
F PostScript mit Java "drucken" Allgemeine Java-Themen 12
G Das aktuelle Fenster drucken Allgemeine Java-Themen 13
T PDF drucken: "invalid flavor" Allgemeine Java-Themen 8
R Rechnung aus Java heraus erstellen und drucken Allgemeine Java-Themen 8
T Drucken von RTF-Dokumenten? Allgemeine Java-Themen 11
H Drucken unter Linux funktioniert nicht Allgemeine Java-Themen 2
A Nochmals Drucken Allgemeine Java-Themen 2
N Drucken+Papiergröße Allgemeine Java-Themen 9
B Daten zum Drucken aufbereiten Allgemeine Java-Themen 8
S Text optimal drucken Allgemeine Java-Themen 2
G drucken von html-code Allgemeine Java-Themen 2
S drucken unter j2sdk-1.4 möglich; unter jdk1.5 nicht; warum? Allgemeine Java-Themen 4
M Problem mit PageFormat beim Drucken Allgemeine Java-Themen 2
S Drucken!er druckt es zu groß aus! Allgemeine Java-Themen 5
S Drucken! Allgemeine Java-Themen 2
A Prof. Lib fürs Drucken Allgemeine Java-Themen 5
J Eine Rechnung speichern vom Drucken Allgemeine Java-Themen 3
J vorm Drucken speichern Allgemeine Java-Themen 3
J Drucken mit Java Allgemeine Java-Themen 2
S Drucken: Seite x von y ? Allgemeine Java-Themen 2
W Ablaufanzeige beim Drucken mit printerJob Allgemeine Java-Themen 3
T Drucken von Daten in einen DIN A5 Vordruck Allgemeine Java-Themen 2
P Drucken einer Excel Datei in Java Allgemeine Java-Themen 8
J Attribute beim Drucken ändern/ausstellen Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben