# Drucken Schacht auswählen/bestimmen



## MScalli (5. Dez 2007)

Hi leutz.
folgendes Problem, ich will was ausdrucken aber will den schacht dabei bestimmen.

habe folgendes beispiel gefunden aber das funktioniert nicht wirklich bei mir.

http://forum.java.sun.com/thread.jspa?forumID=28&threadID=666977

hab mal meinen Code in ein laufendes Programm gepackt damit man sich das mal anschaun kann. 
ich komm allein echt nimmer weiter!!


```
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.HashMap;

import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaTray;

class MyPrinter
{
	public static void main( String[] args )
	{	
		setTray();
		System.exit( 0 );
	}

	public static void setTray(){
	    HashMap<PrintService, ArrayList<MediaTray>> map = new HashMap<PrintService, ArrayList<MediaTray>>();
	    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
	    PrintService service = null;
	    for (int i=0; i<services.length; i++) {
		      service = services[i];
		      System.out.println(i + ". -->" + service);
		      ArrayList<MediaTray> trays = new ArrayList<MediaTray>();
		      map.put(service, trays);
		      Object attributes;
		      attributes = service.getSupportedAttributeValues(Media.class, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);
		      if (attributes != null && attributes.getClass().isArray()) {
		    	  Media[] media = (Media[]) attributes;
		          for (int iMedia=0; iMedia<media.length; iMedia++)
		        	  if (media[iMedia] instanceof MediaTray){
		        		  System.out.println("   " + media[iMedia]);
		        		  trays.add((MediaTray) media[iMedia]);
		        	  }
		      }   
	    }
	    System.out.println("vor dem add");

	    HashPrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
      
	    System.out.println(map);
	    //System.out.println(map.get("\\\\Xpws_mg\\HP LaserJet 5");
      
	    attributeSet.add(map.get("\\\\Xpws_mg\\HP LaserJet 5").get(0));
	    // (first tray for this printer, for example)
      
	    System.out.println("nach dem add");
	    PrinterJob printJob = PrinterJob.getPrinterJob();
	    try {
	    	printJob.print(attributeSet);
	    } catch (PrinterException e) {
	    	e.printStackTrace();
	    }
	}
}
```

diese Zeile will Ihren Zweck nicht erfüllen

```
attributeSet.add(map.get("\\\\Xpws_mg\\HP LaserJet 5").get(0));
```

wenn man sich die Zeile ausgeben lässt ist sie immer null.
egal welchen Drucker ich nehme.
Ich hab auch mal paar println eingebaut damit man weiss was passiert.
nach dem link sollte das eigentlich so funktionieren.

Ich hoffe mir kann da irgendwer helfen 

PS:diesen lösungsweg kenne ich aber er bringt mir nichts da ich auch drucker mit n trays ansprechen muss und diese einzeln auswählen muss


```
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
printRequestAttributeSet.add(MediaTray.BOTTOM); // oder TOP, BOTTOM usw.
```

gruss
MScalli


----------



## tuxedo (5. Dez 2007)

Hilft das vielleicht weiter? --> http://www.java-forum.org/de/viewtopic.php?t=56692&highlight=mediatray

- Alex


----------



## MScalli (5. Dez 2007)

leider nicht. 
das ist genau das was ich unten geschrieben habe 

da kann man nur bestimmte trays auswählen wie eben BOTTOM, TOP, SIDE, MIDDLE, MANUAL usw.
ich muss halt auf alle zugreifen können.


----------

