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.
Ich starte den Druckvorgang
und habe dazu eine Klasse geschrieben, die das Interface Printable implementiert
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?
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: