Drucken einer GUI-Komponenter ?

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich möchte meine GUI (JFrame) in Java ausdrucken, aber da gibt es bei mir Probleme mit der Skalierung. Es wird zwas ausgedruckt, aber nur ein Viertel von meiner GUI wird auf dem DIN A4 ausgedruckt. Was muss ich machen ,damit meine GUI (bzw. JFrame) automatisch so skaliert und ausgedruckt werden kann, dass es auf genau ein DIN A4 drauf passt?

Ich rufe einfach folgendes auf:

Code:
PrintUtilities.printComponent(meineGUI) :

und die Klasse PrintUtilities sieht so aus:

Code:
import java.awt.*;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.*;
import java.awt.print.*;

/** A simple utility class that lets you very simply print
 *  an arbitrary component. Just pass the component to the
 *  PrintUtilities.printComponent. The component you want to
 *  print doesn't need a print method and doesn't have to
 *  implement any interface or do anything special at all.
 *  


 *  If you are going to be printing many times, it is marginally more 
 *  efficient to first do the following:
 *  <PRE>
 *    PrintUtilities printHelper = new PrintUtilities(theComponent);
 *  </PRE>
 *  then later do printHelper.print(). But this is a very tiny
 *  difference, so in most cases just do the simpler
 *  PrintUtilities.printComponent(componentToBePrinted).
 *
 *  7/99 Marty Hall, [url]http://www.apl.jhu.edu/~hall/java/[/url]
 *  May be freely used or adapted.
 */

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();
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    PageFormat pf = printJob.pageDialog(aset);
    printJob.setPrintable(this, pf);
    if (printJob.printDialog())
      try {
        printJob.print();
      } catch(PrinterException pe) {
        System.out.println("Error printing: " + pe);
      }
  }

  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    if (pageIndex > 0) {
      return(NO_SUCH_PAGE);
    } else {
      Graphics2D g2d = (Graphics2D)g;
      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
      disableDoubleBuffering(componentToBePrinted);
      componentToBePrinted.paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }

  /** The speed and quality of printing suffers dramatically if
   *  any of the containers have double buffering turned on.
   *  So this turns if off globally.
   *  @see enableDoubleBuffering
   */
  public static void disableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(false);
  }

  /** Re-enables double buffering globally. */
  
  public static void enableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(true);
  }
}

Aber nur ein Viertel (oberste linkste teil) meiner GUI wird somit ausgedruckt. Wie kann ich meine GUI skalieren und sich auf ein DIN A4 anpassen lassen?

Viele Grüße

Taha
 
Graphics2D#scale(..)

Beispiel:
Code:
double scale=(pageFormat.getImageableWidth()/componentToBePrinted.getWidth()); 
g2d.scale(scale, scale);
 
Hallo nochmal,

so wie die PrintUtilities-Klasse ist, kann man damit nur Sachen ausdrucken , die von Component abgeleitet sind. Wie könnte ich jetzt SWT-Komponente drucken? Meines Wissens sind diese nicht von Component abgeleitet. Wie könnte ich die PrintUtilities-Klasse umschreiben bzw. wie könnte ich eine SWT-Komponente ausdrucken?

Viele Grüße

Taha
 
Anonymous hat gesagt.:
Hallo,

ich möchte meine GUI (JFrame) in Java ausdrucken, aber da gibt es bei mir Probleme mit der Skalierung. Es wird zwas ausgedruckt, aber nur ein Viertel von meiner GUI wird auf dem DIN A4 ausgedruckt. Was muss ich machen ,damit meine GUI (bzw. JFrame) automatisch so skaliert und ausgedruckt werden kann, dass es auf genau ein DIN A4 drauf passt?

Ich rufe einfach folgendes auf:

Code:
PrintUtilities.printComponent(meineGUI) :

und die Klasse PrintUtilities sieht so aus:

Code:
import java.awt.*;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.*;
import java.awt.print.*;

/** A simple utility class that lets you very simply print
 *  an arbitrary component. Just pass the component to the
 *  PrintUtilities.printComponent. The component you want to
 *  print doesn't need a print method and doesn't have to
 *  implement any interface or do anything special at all.
 *  


 *  If you are going to be printing many times, it is marginally more 
 *  efficient to first do the following:
 *  <PRE>
 *    PrintUtilities printHelper = new PrintUtilities(theComponent);
 *  </PRE>
 *  then later do printHelper.print(). But this is a very tiny
 *  difference, so in most cases just do the simpler
 *  PrintUtilities.printComponent(componentToBePrinted).
 *
 *  7/99 Marty Hall, [url]http://www.apl.jhu.edu/~hall/java/[/url]
 *  May be freely used or adapted.
 */

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();
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    PageFormat pf = printJob.pageDialog(aset);
    printJob.setPrintable(this, pf);
    if (printJob.printDialog())
      try {
        printJob.print();
      } catch(PrinterException pe) {
        System.out.println("Error printing: " + pe);
      }
  }

  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    if (pageIndex > 0) {
      return(NO_SUCH_PAGE);
    } else {
      Graphics2D g2d = (Graphics2D)g;
      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
      disableDoubleBuffering(componentToBePrinted);
      componentToBePrinted.paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }

  /** The speed and quality of printing suffers dramatically if
   *  any of the containers have double buffering turned on.
   *  So this turns if off globally.
   *  @see enableDoubleBuffering
   */
  public static void disableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(false);
  }

  /** Re-enables double buffering globally. */
  
  public static void enableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(true);
  }
}

Aber nur ein Viertel (oberste linkste teil) meiner GUI wird somit ausgedruckt. Wie kann ich meine GUI skalieren und sich auf ein DIN A4 anpassen lassen?

Viele Grüße

Taha
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben