Chris: Problem beim Drucken

Hallo!

Ich bin dabei eine Druckfunktion zu implementieren. Bisher habe ich:
// ===========================
static public class druckbar implements Printable
{
public int print(Graphics g, PageFormat pf, int page) throws PrinterException
{
int i = 0;
g.setColor(Color.BLACK);
int j = 0;
int y = (int)pf.getImageableY()+5;

while (anzahl>0)
{
while (y<pf.getImageableHeight()-5)
{
g.drawString(String.valueOf(Ausgabe.get(j)),(int)(pf.getImageableX()+5),y);
y += 20;
g.dispose();
}
g.dispose();
anzahl--;
y = (int)pf.getImageableY()+5;
}
return i;
}
}

// ===========================

public void Drucken(Vector Druck)
{
ls_tools x = new ls_tools();
druckbar db = new druckbar();
int i = 0;

Ausgabe = Druck;

PrinterJob pj;
pj = PrinterJob.getPrinterJob();

PageFormat pfd = pj.defaultPage();
PageFormat pf = pj.pageDialog(pfd);

if (pfd != pf)
pj.setPrintable(db,pf);
else
pj.setPrintable(db,pfd);

pj.printDialog();

anzahl = pj.getCopies();

try
{
pj.print();
}
catch (Exception e){ e.printStackTrace(); }
}

// ===========================

Die Variablen anzahl und Ausgabe sind static, Ausgabe ist ein Vector, in dem die Daten, die Gedruckt werden sollen, sind.

Wenn ich die Methode "Drucken" aufrufe, kommen zwar Seiten raus, diese sind aber leer. Wenn ich in der Klasse "Druckbar" nur ein g.drawString("Text",300,300) schreibe, wird der Text aber ausgegeben. Das "dispose" habe ich auch schon an verschiedene Stellen geschrieben, klappt aber nicht. Brauche ich es überhaupt?

Was mache ich falsch?

  1. Hallo Chris,

    int j = 0;
    int y = (int)pf.getImageableY()+5;

    while (anzahl>0) {
      while (y<pf.getImageableHeight()-5) {
        g.drawString(String.valueOf(Ausgabe.get(j)),(int)(pf.getImageableX()+5),y);
        y += 20;
        g.dispose();
      }
      g.dispose();
      anzahl--;
      y = (int)pf.getImageableY()+5;
    }

    Du hast hier 2 Laufvariablen j und y. j dient wohl dazu, die einzelnen Elemente durchzugehen, wärend y dazu dient, die Position des Textes auf dem Blatt zu verschieben. An dieser Stelle while statt for Schleifen zu verwenden, ist schon keine gute Idee, da man mit while-Schleifen viel schneller fehler macht, als mit for-Schleifen.
    Außerdem ist mir Schleierhaft, warum Du zwei Schleifen ineinander verschachtelst. Mit der äußeren erreichst Du, das die innere Schleife für jedes Element aufgerufen wird. Mit der inneren erreichst Du dann, dass drawString so lange für EIN Element aufgerufen wird, wie auf der Seite platz ist.
    Das ist aber natürlich nicht der Grund, dass gar nichts ausgedruckt wird. Das liegt vermutlich daran, dass Du dispose() aufrufst. Wie bist Du denn darauf gekommen, das zu tun? Die Methode dient dazu, die resourcen, die ein Graphics Objekt belegt explizit frei zu geben. Da Graphics Objekte recht groß werden können und der Garbage Collector sie u.U. erst sehr spät löscht, gibt es diese Methode.
    Darum muss man sich aber nur kümmern, wenn man Graphics Objekte selbst erzeugt. In den meisten Fällen bekommt man aber wie in diesem ein Graphics Objekt übergeben und muss sich nicht darum kümmern, was weiter damit passiert. Wenn Du nun trozdem diese Methode aufrufst, werden natürlich alle Daten im Graphics Objekt gelöscht.

    Noch ein kleines (ungetestetes) Beispiel, das das tut, was Du wohl mit dem oben zitierten Code erreichen willst:

    for(int j = 0; j < anzahl && (j + 1) * 20 <= pf.getImageableHeight() - 10 ; j++) {
      g.drawString(String.valueOf(Ausgabe.get(j)),(int)(pf.getImageableX()+5),pf.getImageableY() + 5 + 20 * j);
    }

    Noch ein Tutorial zum Drucken in Java: http://java.sun.com/docs/books/tutorial/2d/printing/index.html

    Grüße

    Daniel

    1. Danke!

      Läuft jetzt schon besser! Dispose habe ich verwendet, weil man es beim Drucken mit PrintJob gebraucht hat, bei PrinterJob jetzt aber wohl nicht mehr...

      Allerdings gibt es wieder ein Problem, siehe Thread "Drucken unter Java".......

      Grüsse, Chris