Ein Bild aus einem Panel drucken?

Math55

Mitglied
hi, ich hab in meiner anwendung ein bild ein einem panel. das möchte ich gern drucken. allerdings OHNE das das ganze programm rundrum mit gedruckt wird und auch dieborder, welche ich mit setborder beim panel gesetzt habe sollte nicht mit gedruckt werden. eine idee?

danke:-)
 
hi, hab ich durchsucht. da ist zwar ein beispiel von dir, welches was ausdruckt, aber allerdings wieder mit dem rahmen des panels....

:-|
 
Hi,

der obige Link geht nicht mehr und ich hab da so ein ähnliches Problem.

Und zwar möchte ich eine javax.swing.Box drucken und bis dato bin ich über 100 Tutorials gestolpert die alle meinen auch Swing Objekte drucken zu können, aber über drawLine und drawRect gehen die alle nicht hinaus. Ich würde gerne das komplette Objekt, so wie es ist, zum Drucker schieben, wie geht dem?
 
Sooo, hab was gefunden, so ungefähr gehts, man muss nur aufpassen ich hab die Orientierung jetzt von hochkant auf quer geändert. Ansonsten ist das ein schönes PrintUtility:

Code:
public class PrintUtilities implements Printable {	
	
	private Component componentToBePrinted;
	
	public static void printComponent(Component c) {
		new PrintUtilities(c).print();
	}
	
	public PrintUtilities(Component componentToBePrinted) {
		this.componentToBePrinted = componentToBePrinted;		
	}
	
	public void print() {
		PrinterJob printJob = PrinterJob.getPrinterJob();
		printJob.setPrintable(this);
		if (printJob.printDialog())
			try {
				System.out.println("Calling PrintJob.print()");
		        printJob.print();
		        System.out.println("End PrintJob.print()");
			} catch(PrinterException pe) {
				System.out.println("Error printing: " + pe);
			}
	}
	
	public int print(Graphics g, PageFormat pf, int pageIndex) {	
		
		pf.setOrientation(PageFormat.LANDSCAPE);
		
		int response = NO_SUCH_PAGE;
		Graphics2D g2 = (Graphics2D) g;
		
		// for faster printing, turn off double buffering
		disableDoubleBuffering(componentToBePrinted);
		
		Dimension d = componentToBePrinted.getSize(); //get size of document
		double panelWidth = d.width; //width in pixels
		double panelHeight = d.height; //height in pixels
		double pageHeight = pf.getImageableHeight(); //height of printer page
		double pageWidth = pf.getImageableWidth(); //width of printer page
		
		double scaleX = pageWidth / panelWidth;
		double scaleY = pageHeight / panelHeight;
		
		int totalNumPages = (int) Math.ceil(scaleY * panelHeight / pageHeight);
		
		// make sure not print empty pages
		if (pageIndex >= totalNumPages) {
			response = NO_SUCH_PAGE;
		} else {
			// shift Graphic to line up with beginning of print-imageable region
			g2.translate(pf.getImageableX(), pf.getImageableY());
			// shift Graphic to line up with beginning of next page to print
			g2.translate(0f, -pageIndex * pageHeight);
			// scale the page so the width fits...
			g2.scale(scaleX, scaleY);
			componentToBePrinted.paint(g2); //repaint the page for printing			
			response = Printable.PAGE_EXISTS;
		}
		enableDoubleBuffering(componentToBePrinted);		
		return response;
	}
	
	public static void disableDoubleBuffering(Component c) {
		RepaintManager currentManager = RepaintManager.currentManager(c);
		currentManager.setDoubleBufferingEnabled(false);
	}
	
	public static void enableDoubleBuffering(Component c) {
		RepaintManager currentManager = RepaintManager.currentManager(c);
		currentManager.setDoubleBufferingEnabled(true);
	}
	
	
}
 
Hi alle,

@slang: hab mich mal mit deinem PrintUtility befasst. Das funktioniert wunderbar. Hab es nun auch in meiner Applikation zum printen implementiert.

Mein Problem sieht so aus: Ich möchte ein JFrame drucken. Es muss landscape sein!
Das PrintUtility funktioniert bei mir leider nur wenn es im Porträtmodus druckt. Ansonsten werden z.T. Icons nicht mitgedruckt.


Hat jemand schon mal gleiche Probleme angetroffen?


Weiss jemand rat? Ich wäre um jede Hilfe dankbar.

MfG Claudio
 
Zuletzt bearbeitet:
Hi allerseits,

Hab das Problem gefunden!

Es liegt am Format der Bilder. Ich habe GIF-Images benützt, die mit Interlaced Farben versehen waren. Nach dem Ändern auf RGB farben hat das ganze funktioniert.

MfG
Claudio
 
Zurück