PrintJob.getGraphics(); gibt null

Hallo,

Ich versuche unter Java zu drucken und bekomme eine
NullPointerException. Diese wird ausgelöst, weil bei

Graphics page = printJob.getGraphics();

"page" als Wert null wird. Wenn ich nun z.B. versuche den Font zu
setzen und auf "page" zugreife, wird natürlich eine
NullPointerException geschmissen.

Nun die Frage:
Was genau passiert bei getGraphics() und hatte jemand schonmal ein
ähnliches Problem und konnte es dann wie lösen

Ich entwickle mit dem JDK 1.4.2 unter Linux.

Gruss
Juri
 
Moin,
also ich hab noch nichts mit getGraphics() benutzt beim Drucken. Ist ja auch nicht nötig, denn bei der notwendigen Einbindung des Interfaces Printable wird in der Interface-Methode das Graphics-Objekt übergeben:

Code:
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
		throws PrinterException
 
Hi Snape,

kannst du mir wohl ne Beispielklasse schicken/posten? Ich versteh nicht ganz wie du das print() einbinden willst..!
Und da ich sowas am besten an ner ganzen Klasse sehe....!

Danke im Voraus
Juri
 
Code:
public class Printer implements Printable {
 
 
private Component c;
 
private PrinterJob pj;
 
private PageFormat pf;
 
  
public static void printComponent(Component c) {
 
new Printer(c).print();
 
}
 
private Printer(Component c) {
 
this.c = c;
 
}
 
 
 
private boolean setPage() {
 
PageFormat pfDefault = pj.defaultPage();
 
this.pf = pj.pageDialog(pfDefault);
 
return pf != pfDefault;
 
}
 
  
private boolean setPrinter() {
 
return pj.printDialog();
 
}
 
 
public void print() {
 
this.pj = PrinterJob.getPrinterJob();
 
if (setPage() && setPrinter()) {
 
pj.setPrintable(this, pf);
 
}
 
try {
 
pj.print();
 
}
 
catch (PrinterException pe) {
 
pe.printStackTrace();
 
}
 
}
 
 
 
 
 
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
 
if (page > 0) return Printer.NO_SUCH_PAGE;
 
Graphics2D g2 = (Graphics2D)g;
 
g2.translate(pf.getImageableX(), pf.getImageableY());
 
RepaintManager currentManager = RepaintManager.currentManager(c);
 
currentManager.setDoubleBufferingEnabled(false);
 
c.paint(g2);
 
currentManager.setDoubleBufferingEnabled(true);
 
return Printable.PAGE_EXISTS;
 
}
 
}


...so etwa.

CU schnuffie
 
Dankeschön für die Sourcen, aber mir wird immer noch nicht klar, wie ich dann die Methode print(Graphics g.....) aufrufen muss.
So wie ich das sehe, werden ja mit Graphics die eigentlichen Druckdaten übergeben. Aber wie bekomme ich die denn in Graphics rein
Mir würd es also ungemein helfen, wenn mir noch jemand eine passende main-Methode dazu liefern könnte....!

Gruss
Juri

Ps: Vielleicht hab ich auch 'n Brett vorm Kopf, ich weiß es nicht...
 
Moin,
dazu gibt es keine passende main-Methode, denn das print(...) wird von Java automatisch ausgeführt, wenn z.B.

printer.getPrintJob().print();

aufgerufen wird. D.h. in der print(...)-Methode muss all das gezeichnet werden, was in dem Ausdruck erscheinen soll.
 
Danke, aber das hat mich nicht weitergebracht. :-(
Vielleicht hab ich mich unklar ausgedrückt:
Ich versteh nicht, wo ich wie die Daten (z.B. irgendein Text) reinpacken muss, und wie ich das ganze dann aufrufen muss.
Und was dieses Graphics ist, hab ich auch nicht verstanden. :confused:

Gruss
Juri
 
Tach,
na die Daten musst Du natürlich in Deiner Klasse, die das Interface Printable implementiert, zur Verfügung stellen.
Was meinst Du mit "drum herum aufrufen" und warum klammerst Du Dich so sehr an das Graphics-Objekt? Das wird Dir geliefert. Ebenso wie wenn Du die paint(...)-Methode überschreibst.
 
Ok, du hälst mich jetzt wahrscheinlich für begriffsstutzig, aber ich raff das nicht....!

Welche von den Methoden ruf ich denn auf? Ich gehe mal von print(....) aus. Und wenn ich jetzt beispielsweise einen String s hab wie wird dieser der print(....)-Methode übergeben. Und warum wird mir das Graphics-Objekt geliefert? Dann würd ich ja doch nicht die print(....)-Methode aufrufen, sondern eine andere....
Kann mir denn niemand eine lauffähige Klasse geben, die ich ausführen kann um dann den kompletten Ablauf zu verstehen?
Ich hab schon einen Arbeitskollegen gefragt, aber der ist da auch nicht druchgestiegen

Gruss
Juri
 
Juri Schlönz hat gesagt.:
Ok, du hälst mich jetzt wahrscheinlich für begriffsstutzig, aber ich raff das nicht....!

Merke ich, aber ich selbst versteh das Problem nicht.

Welche von den Methoden ruf ich denn auf? Ich gehe mal von print(....) aus.

NEIN! Diese Methode wird von Java intern aufgerufen, ebenso wie paint(...)

Und wenn ich jetzt beispielsweise einen String s hab wie wird dieser der print(....)-Methode übergeben.

Gar nicht. Führe all die Manipulationen, Datentransfers usw. vorher durch, bevor Du die print()-Methode auf Deinem PrintJob-Objekt aufrufst.

Und warum wird mir das Graphics-Objekt geliefert? Dann würd ich ja doch nicht die print(....)-Methode aufrufen, sondern eine andere....

Genau, s.o. :)

Kann mir denn niemand eine lauffähige Klasse geben, die ich ausführen kann um dann den kompletten Ablauf zu verstehen?
Ich hab schon einen Arbeitskollegen gefragt, aber der ist da auch nicht druchgestiegen

Gruss
Juri

Schau mal hier, das wird in der GUI-Klasse aufgerufen:
Code:
	private void jbPrint_actionPerformed(ActionEvent actionEvent)
	{
		printer.getPrintJob().setPrintable(printer, printer.getPageFormat());

		if (printer.getPrintJob().printDialog())
		{
			try
			{
			  printer.getPrintJob().print(); // Drucken
			}
			catch (PrinterException e)
			{
			} // TODO Printer catch PrinterException
		}
		return;
	}

Wobei das getPrintJob() in der Klasse mit dem Printable-Interface hier so implementiert ist:
Code:
        public PrinterJob printJob = null;

	public PrinterJob getPrintJob()
	{
		if (printJob == null)
		{
			printJob = PrinterJob.getPrinterJob();
		}

		return printJob;
	}
 
Zurück