# Klasse Printerjob



## tritko1 (11. Jan 2007)

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.......


----------



## tritko1 (12. Jan 2007)

Ist das denn nur mit dem zwei Dialogfeldern PageDialog und PrintDialog möglich?

Danke für eure Auskünfte...


----------



## thE_29 (12. Jan 2007)

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!


----------



## tritko1 (12. Jan 2007)

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...


----------



## thE_29 (12. Jan 2007)

Das du dich bemüht hast kann ich mir kaum vorstellen ^^


```
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

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

Ist mal ob es Hoch/Querformat ist.


```
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!


----------



## tritko1 (17. Jan 2007)

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

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.......


----------



## tritko1 (18. Jan 2007)

Was habe ich falsch gemacht?

Danke vielmals....


----------



## thE_29 (18. Jan 2007)

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!


----------



## tritko1 (18. Jan 2007)

Das ist mein 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)?


----------



## thE_29 (18. Jan 2007)

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!


----------



## tritko1 (18. Jan 2007)

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?


```
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


```
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)


----------



## tritko1 (19. Jan 2007)

Kann keiner mit diesem Fehler was anfangen?


----------



## thE_29 (19. Jan 2007)

Probier den flavor mal auf das:
      DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;


----------



## tritko1 (19. Jan 2007)

Kann keiner mit diesem Fehler was anfangen?


----------



## thE_29 (19. Jan 2007)

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!


----------



## tritko1 (19. Jan 2007)

Habe deine vorherige Nachricht nicht gelesen - mein Fehler. 

Danke für deinen Tipp. Werde Ihn gleich anwenden.


----------



## tritko1 (19. Jan 2007)

Das klappt - dankeschön. 

Aber in printService


```
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


----------



## tritko1 (22. Jan 2007)

Noch ne Frage: Wie ist es denn möglich, ein Object oder String zu einem PrintService zu casten?

Danke


----------



## thE_29 (22. Jan 2007)

Ganz normal casten 

Wenn es den geht (sonst kriegst sowieso ne ClassCastException)


----------



## tritko1 (22. Jan 2007)

Ja, bekomm ja ne ClasscastException - will dies ja vermeiden..

Aber wie nur??


----------



## thE_29 (22. Jan 2007)

Naja, dann geht das eben nicht 

Woher hast du den die Drucker?


----------



## tritko1 (22. Jan 2007)

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


----------



## thE_29 (22. Jan 2007)

Na so geht das sicher nicht 

Du kannst nicht einen String in irgendwas casten..

Ich guck mal wie der die printService anlegt!


----------



## tritko1 (23. Jan 2007)

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


----------



## tritko1 (24. Jan 2007)

Ich hoffe, das Casten geht irgendwie, denn dann kann ich
meine JList vergessen.


----------



## tritko1 (5. Feb 2007)

@the29

Hast du diesbezüglich schon was 
herausgefunden?

Danke


----------



## thE_29 (6. Feb 2007)

Nope, leider nicht...

Vielleicht gehts aber mit java 1.6 schon besser! Probiere ja alles immer in 1.4!


----------

