Klasse Printerjob

Status
Nicht offen für weitere Antworten.

tritko1

Bekanntes Mitglied
Ich möchte gerne einen Printerjob schreiben, ohne das ich PageDialog
bzw. Printerdialog anspreche. Die Seitenzahl (von und bis in einem JTextfield)
bzw. die Druckerauswahl (JList) habe ich schon über einen JFrame abgefragt.
Das Pageformat möchte ich auch so angeben, ohne irgendein zusätzl. Fenster
zu öffnen.

Wie kann ich denn diese drei Sachen dem Printerjob übergeben?

Vielen Dank im Voraus.......
 
Ist das denn nur mit dem zwei Dialogfeldern PageDialog und PrintDialog möglich?

Danke für eure Auskünfte...
 
Nein, das kann man setzen!

Aber das setzen selber ist extremst blöd und eigentlich nirgends dokumentiert (bzw ich hab nix gefunden 😉)

javax.print.attribute.standard

Hier gibts die Klassen mit denen man die Attribute setzen kann!
google mal ein bisi vielleicht findest was!
 
Habe bis jetzt ein bisschen durchgestöbert. Also ich habe immer noch keinen Plan.

Hat denn einer noch ne Idee, wie die Klassen heißen könnten? Ich habe Sie bis jetzt noch nicht gefunden...
 
Das du dich bemüht hast kann ich mir kaum vorstellen ^^

Code:
      PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

      if(this.landscape)
        pras.add(OrientationRequested.LANDSCAPE);
      else
        pras.add(OrientationRequested.PORTRAIT);

Ist mal ob es Hoch/Querformat ist.

Code:
      PrintService service = null;
      int[][] pages = new int[1][2];
      DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG; //das er ein png ausdruckt
        pages[0][0] = 1;
        pages[0][1] = sizeCount;
        //setzt das auszudruckend Dokument fest
        PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor,
            pras);
        PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
        //setzt von bis drucken
        javax.print.attribute.standard.PageRanges range = new javax.print.attribute.
            standard.PageRanges(pages);
        pras.add(range);
        //wenn als Device -1 übergeben wird, wird ein Dialog für das drucken auswählen ausgegeben!
        if (!useDefPrinter)
        {
          service = ServiceUI.printDialog(this.graphic, 200, 200,
                                          printService, defaultService, flavor, pras);
        }
        //ansonsten wird der 1te (Standard/Default) Drucker genommen
        else
        {
          //ansonsten standarddevice
          if (printService != null && printService.length != 0)
            service = printService[0];
        }

pages müssten die Seiten sein!
 
Habe den Code so gelassen und übernommen, außer das ich die GraphicsConfiguration (bis dahin wurde der Code eingefügt) eingefügt habe.

Code:

Code:
service = ServiceUI.printDialog( GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(), 200, 200, printService, defaultService, flavor, pras);


Er bringt mir jetzt diesen Fehler:

java.lang.IllegalArgumentException: services must be non-null and non-empty
at javax.print.ServiceUI.printDialog(Unknown Source)
at com.sk.vw.inventur.print.DisplayPanel.actionPerformed(DisplayPanel.java:130)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)


Die Variable services kann doch gar nicht null sein bzw. nicht leer.......
 
Wenn du den Code oben 1:1 übernommen hast, geht der, ansonsten hast du nen Fehler gemacht!

Poste mal deinen ganzen Code, bzw den Drucken Teil!
 
Das ist mein Code.

Code:
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
			pras.add(OrientationRequested.PORTRAIT);
			
			PrintService service = null; 
			int[][] pages = new int[1][2]; 
			DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN; //das er ein txt ausdruckt 
					
			pages[0][0] = 1; 
			pages[0][1] = rowData.length; 

			/* Locates print services capable of printing the specified DocFlavor.
			 * Stellt fest, welche Drucker Textdateien und Hochformat drucken.
			 * Gibt nicht null aus.
			 */ 
			PrintService []printService = PrintServiceLookup.lookupPrintServices(flavor, pras); 
			
			//Der Standardrucker wird übergeben. Wird ausgegeben
			PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); 
					
			//setzt von bis drucken 
			javax.print.attribute.standard.PageRanges range = new javax.print.attribute. standard.PageRanges(pages); 
			pras.add(range); 	
			service = ServiceUI.printDialog( GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(), 200, 200, printService, defaultService, flavor, pras);


Also der Druckername habe ich per JList abgefragt, Die von und bis in einem JTextfield und die Daten (kann über eine Datei, ArrayList bzw. Array) ausgelesen werden. Wie kann ich diese Daten diesem Printer übergeben, ohne einen Printer- bzw. PageDialog zu öffnen (soll gar nicht geöffnet werden)?
 
Naja, der printDialog ist ja der entscheidene der nen Dialog öffnet!

Weiße dem service einfach defaultService zu oder printService[0] und drucke dann mal!
 
Bei PrintService[0] hat er leider einen Fehler aus und bei defaultService hat er den Printer angenommen. So, jetzt hat er noch einen anderen Fehler. Was will er denn jetzt von mir?

Code:
MyDruckListener drucker = new MyDruckListener();
			PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
			pras.add(OrientationRequested.PORTRAIT);
			
			PrintService service = null; 
			int[][] pages = new int[1][2]; 
			DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN; //das er ein txt ausdruckt 
					
			pages[0][0] = 1; 
			pages[0][1] = rowData.length; 

			/* Locates print services capable of printing the specified DocFlavor.
			 * Stellt fest, welche Drucker Textdateien und Hochformat drucken.
			 * Gibt nicht null aus.
			 */ 
			PrintService []printService = PrintServiceLookup.lookupPrintServices(flavor, pras); 
			
			//Der Standardrucker wird übergeben. Wird ausgegeben
			PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); 
					
			//setzt von bis drucken 
			javax.print.attribute.standard.PageRanges range = new javax.print.attribute. standard.PageRanges(pages); 
			pras.add(range);
			service = defaultService;
			
			if (service != null) 
			{
				DocPrintJob job = service.createPrintJob();
				// fügt listener hinzu
				job.addPrintJobListener(drucker);
				try
				{
					FileInputStream fis = new FileInputStream("D:\\Documents and Settings\\DLBWMRC\\Projekt SAP Richter\\Projektdateien\\Lagertest.txt");
					DocAttributeSet das = new HashDocAttributeSet();
					Doc doc = new SimpleDoc(fis, flavor, das);
					job.print(doc, pras);
				}
				
				catch (FileNotFoundException e)
				{
					e.printStackTrace();
				}
				
				catch (PrintException e)
				{
					e.printStackTrace();
				}
			}


Klasse MyDruckListener

Code:
class MyDruckListener implements PrintJobListener 
{
	public void printDataTransferCompleted(PrintJobEvent printJobEvent) 
	{
		System.out.println("Daten wurden zum Drucker geschickt!");
	}

	public void printJobCompleted(PrintJobEvent printJobEvent) 
	{
		System.out.println("Drucker hat fertig gedruckt!");
	}

	public void printJobFailed(PrintJobEvent printJobEvent) 
	{
		System.out.println("Fehler beim Drucken!");
	}

	public void printJobCanceled(PrintJobEvent printJobEvent) 
	{
		System.out.println("Abbruch des druckes!");
	}

	public void printJobNoMoreEvents(PrintJobEvent printJobEvent) 
	{
		System.out.println("JobNoMoreEvents!");
	}

	public void printJobRequiresAttention(PrintJobEvent printJobEvent) 
	{
		System.out.println("JobRequieresAttention!");
	}
}


Fehlermeldung:

java.lang.IllegalArgumentException: data is not of declared type
at javax.print.SimpleDoc.<init>(Unknown Source)
at com.sk.vw.inventur.print.DisplayPanel.actionPerformed(DisplayPanel.java:146)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Du gibst ganz einfach an das es DocFlavor.STRING.TEXT_PLAIN ist!

Ist es aber nicht, da du ja einen FileInputStream übergibts...

Nimm das was ich gesagt habe!


Und da du ja mein FAQ Beispiel angschaut hast, würde ich dir raten Dinge so zu belassen wie sie sind!

Den im Bsp steht auch: DocFlavor.INPUT_STREAM.XXX und nicht STRING.XXX!

Wenn man net weiß, was etwas tut, dann sollte es man so belassen oder sich vorher erkundigen und net einfach spaßhalber Dinge ändern!
 
Habe deine vorherige Nachricht nicht gelesen - mein Fehler.

Danke für deinen Tipp. Werde Ihn gleich anwenden.
 
Das klappt - dankeschön.

Aber in printService

Code:
PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);


wird nichts in den Array hineingespeichert. Habe schon bei OrientationRequested auf PORTRAIT bzw. LANDSCAPE umgestellt, aber es ist trotzdem nicht möglich.

Wie bekommt man dann die ganzen Drucker in ein Array?

Danke vielmals nochmal
 
Habe den Drucker aus einer JList und gebe frage den angeklickten Drucker mit getSelectedValue (bekomme ein Object) ab und möchte diesen Wert an einen PrintService übergeben.

Wie ist das möglich?

Danke
 
Na so geht das sicher nicht 😉

Du kannst nicht einen String in irgendwas casten..

Ich guck mal wie der die printService anlegt!
 
Hast du mal geschaut mit dem Casten?

Wie kann man denn einem Simpledoc eine ArrayList bzw. ein zweidimensionales Array statt dem Object, das das Simpledoc erwartet, übergeben?

Danke nochmal
 
Nope, leider nicht...

Vielleicht gehts aber mit java 1.6 schon besser! Probiere ja alles immer in 1.4!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben