DRUCKEN von z.B. eines JFrame über print(Graphics g)

G

Gast2

Gast
Hallo,

bitte entschuldigt ein neues Thema zum drucken, jedoch blicke ich wirklich gar nciht durch. Bislang war drucken bei uns nie ein Thema nun ist es jedoch aktuell und muss dringend zeitnah gelöst werden.

Ich habe mich mit den Tutorials bei Sun bereits rumgeschlagen. Dort wird jedoch bei JFrames einfach eine Funktion print() ohne Attribute angesprochen welche nicht (mehr?!) existiert.

Insgesamt sind alle Tutorials die ich fand total inkonsistent, sodass ich keinerlei Übersicht mehr habe was aktuell ist und was nicht.

Die Methode benötigt ja ein Graphics Objekt für den Drucker Zugriff.

Meine Frage:

Was ist denn aktuell die gängige Variante dazu? Ein Code Beispiel oder ein Link zu einem aktuellen und kompletten Beispiel wäre auch toll.


Ich habe echt noch nie so viel, und doch so wenig brauchbares zu einem Java API Thema gefunden. Total frustrierend.
 
G

Gast2

Gast
Das Sun Tutorial ist mir bekannt.

Gehts echt nur über die Implementierung von Printable? Gibts da keinen einfacheren Weg?
 
G

Gast2

Gast
Ich hab übers Wochenende doch noch ein interessantes Beispiel zum Thema gefunden. Hier der Quellcode:

Java:
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.RepaintManager;

/**
 * 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).
 * 
 * @author kaf9tr
 * 
 */

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());
            double scale = (pageFormat.getImageableWidth() / componentToBePrinted.getWidth());
            g2d.scale(scale, scale);
            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);
    }
}

Das funktioniert soweit super, allerdings hänge ich noch an folgendem:

Ich möchte, dass die Component so gedruckt wird, als wäre vorher pack ausgeführt worden. Hintergrund ist, dass einige von mir zu druckende Components (JPanels) größer sind als sie sein müssen (Durch die Größe des Fensters ect.). Im Ausdruck sind dann ebenfalls die zu größen Flächen drin. Wenn die Component jedoch nicht komplett dargestellt wird wird sie auch nicht komplett gedruckt.

Mein Problem ist also, dass die Component genauso gedruckt wird wie sie dargestellt wird (Es wird ja auch paint(g) aufgerufen).

Weiss jemand wie man das so erweitern kann, dass die Conmponent immer in genau der Größe gedruckt wird die sie bräuchte? Die Skalierung soll natürlich bleiben.

Ich dachte zuerst daran die paint Methode zu wrappen. Das funktionierte jedoch nicht gut, da ich deren intere Abläufe nicht gut genug kenne.
 

Michael...

Top Contributor
Ich möchte, dass die Component so gedruckt wird, als wäre vorher pack ausgeführt worden.
Es kann nur gezeichnet und gedruckt werden was existiert. Entweder Du rufst vor dem Drucken pack() auf dem JFrame auf und setzt anschließend die Größe wieder zurück, oder Du erstellts einen "Klon" mit identischem Inhalt auf dem Du vor dem Drucken pack() aufrufst.
 
G

Gast2

Gast
Es kann nur gezeichnet und gedruckt werden was existiert. Entweder Du rufst vor dem Drucken pack() auf dem JFrame auf und setzt anschließend die Größe wieder zurück, oder Du erstellts einen "Klon" mit identischem Inhalt auf dem Du vor dem Drucken pack() aufrufst.

Der Hinweis war gut!

Ich setze vor dem Print Befehl die Size auf die Preferred Size. Skaliere dann auf die mögliche Größe und führe nach dem Print ein Revalidate aus. Dadurch wird das Panel dann wieder so groß wie es sein muss.

Funktioniert dann wunderbar. :)
 
G

Gast2

Gast
Also kurz zusammengefasst für suchende:

- Das aktuellste Tutorial ist tatsächlich das von Oracel/Sun.
- Drucken ist wirklich sau aufwendig (außer eine Swing Component hat schon eine Print Funktion. AFAIK haben das aber nur Textkomponenten. Wirklich schön ist auch anders)
- Ich habe es so gelöst, dass mein Panel das Interface Printable implementiert und den Printerjob anlegt.
- Layouting muss man selber machen
- Scaling auch

In meinem Fall habe ich das JPanel nun erst mal auf die Preferred Size gestezt, damit alles gedruckt wird (sonst wird nur der sichtbare Teil gedruckt). Dann das Graphics Objekt skaliert damit alles auf die Seite passt und dann einen paint auf dem JPanel ausgeführt (mit dem graphics Objekt). Hinterher die Resizings wieder Rückgängig gemacht damits in der GUI aussieht wie zuvor.

Wer dann noch will kann natürlich Kopf und Fußzeilen anlegen. Muss man aber auch alles zu Fuß machen.

Wer nähere Fragen hat kann mir gerne auch ne PM schreiben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Drucken mithilfe eines Externen ActionListeners Java Basics - Anfänger-Themen 17
Z Drucken eines JTables mit Text drüber Java Basics - Anfänger-Themen 6
M html-seite drucken (gerendert) Java Basics - Anfänger-Themen 3
T DamagedFontException beim drucken Java Basics - Anfänger-Themen 3
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
U Drucken.. Birt vs Jasper Java Basics - Anfänger-Themen 1
H Drucken auf Drucker Java Basics - Anfänger-Themen 8
B Drucken mit einem Terminal / Bon Printer Java Basics - Anfänger-Themen 4
B HTML Code drucken Java Basics - Anfänger-Themen 4
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
B Drucken in JAVA -> nicht "Java printing" Java Basics - Anfänger-Themen 3
D Erste Schritte HTML aus JEditorPane drucken Java Basics - Anfänger-Themen 5
I Drucken in Java / verschiedene Papierformate Java Basics - Anfänger-Themen 0
I Drucken (Print) monitoren Java Basics - Anfänger-Themen 0
I Erste Schritte Drucken in JAVA / Druckaufträge etc. Java Basics - Anfänger-Themen 15
T Drucken mit Java Java Basics - Anfänger-Themen 16
E Input/Output Drucken am Mac immer gleiche Schriftgröße?!? Java Basics - Anfänger-Themen 2
E Input/Output png Auf Dymo 450 drucken Java Basics - Anfänger-Themen 2
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
C Drucken/Druckdesign mit Java Java Basics - Anfänger-Themen 8
J checkbox status abfragen und drucken Java Basics - Anfänger-Themen 13
K doppeltes paint beim Drucken Java Basics - Anfänger-Themen 8
B Source Code "in einem Rutsch" drucken in Eclipse Java Basics - Anfänger-Themen 5
K Drucken Java Basics - Anfänger-Themen 8
G Mit Java Drucken Java Basics - Anfänger-Themen 11
O OOP prindata Methode aufrufen!? Methode drucken + Konstruktor Java Basics - Anfänger-Themen 9
K einfaches Drucken von Text (und ggf Bildern,gemischt) Java Basics - Anfänger-Themen 11
N barbecue Barcodes drucken Java Basics - Anfänger-Themen 5
H Bericht drucken Java Basics - Anfänger-Themen 4
T [Minimalprogramm] mit Java Drucken Java Basics - Anfänger-Themen 6
L drucken mit DocPrintJob Java Basics - Anfänger-Themen 3
S Inhalt von GUI-Eingabe drucken Java Basics - Anfänger-Themen 7
I PDF aus JSF - Seite drucken mit iText Java Basics - Anfänger-Themen 5
J JTable Drucken Java Basics - Anfänger-Themen 3
J mit COM-Port drucken Java Basics - Anfänger-Themen 8
R mehrseitiges Drucken Java Basics - Anfänger-Themen 3
J Listen - Anzahl positiver Werte drucken Java Basics - Anfänger-Themen 8
H Papierschacht beim Drucken ansprechen Java Basics - Anfänger-Themen 4
T Drucken von Listen bestehend aus Grafik und Text (unter swing) Java Basics - Anfänger-Themen 7
A JTree drucken Java Basics - Anfänger-Themen 2
M html datei drucken Java Basics - Anfänger-Themen 18
E BufferedImage drucken Java Basics - Anfänger-Themen 3
K Drucken mit PrinterJob Java Basics - Anfänger-Themen 3
andresendo Drucken Java Basics - Anfänger-Themen 2
D Drucken - Seite leer Java Basics - Anfänger-Themen 2
S Drucken mit iText? Java Basics - Anfänger-Themen 7
T Formular drucken! Java Basics - Anfänger-Themen 2
S Drucken in farbe Java Basics - Anfänger-Themen 4
G Problem mit Drucken Java Basics - Anfänger-Themen 2
G Strings drucken Java Basics - Anfänger-Themen 2
N Im Querformat drucken mit PrintJob Java Basics - Anfänger-Themen 4
S ich komm mit dem drucken nich klar Java Basics - Anfänger-Themen 17
S Drucken! Java Basics - Anfänger-Themen 16
B Formatierung beim Drucken Java Basics - Anfänger-Themen 4
D Drucken Java Basics - Anfänger-Themen 3
M Drucken Java Basics - Anfänger-Themen 2
B RTF erstellen und drucken Java Basics - Anfänger-Themen 3
G Drucken mit PrintJob oder PrinterJob? Java Basics - Anfänger-Themen 4
F Drucken einer Text Datei Java Basics - Anfänger-Themen 2
M Probleme beim Drucken Java Basics - Anfänger-Themen 4
R String drucken Java Basics - Anfänger-Themen 3
G Drucken von pdf Dokumenten mit Lücken Java Basics - Anfänger-Themen 2
J Drucken von files Java Basics - Anfänger-Themen 4
D Drucken ohne Dialogfeld Java Basics - Anfänger-Themen 2
E HTML Datei drucken Java Basics - Anfänger-Themen 4
G drucken: genaues positionieren Java Basics - Anfänger-Themen 2
R rechtsbündiges Drucken Java Basics - Anfänger-Themen 2
G Drucken Java Basics - Anfänger-Themen 2
D PDF Dokument drucken Java Basics - Anfänger-Themen 10
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
J Serienbrief drucken Java Basics - Anfänger-Themen 2
A Drucken mit Java über FOP Java Basics - Anfänger-Themen 9
B Bilder drucken Java Basics - Anfänger-Themen 4
M Formatiert Drucken in Java Java Basics - Anfänger-Themen 3
A Drucken und Vorschau Java Basics - Anfänger-Themen 4
F Java-Logo drucken Java Basics - Anfänger-Themen 2
S Noch ungelöst ! Klasse JTable und Klasse Drucken verknüpfen. Java Basics - Anfänger-Themen 8
M DATEI DRUCKEN ????? Java Basics - Anfänger-Themen 4
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
J Farbe des Striches eines TitledBorders ändern Java Basics - Anfänger-Themen 2
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
walid Öffnungszeiten eines Geschäftes Java Basics - Anfänger-Themen 3
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
krgewb Breite und Höhe eines Bildes in base64 auslesen Java Basics - Anfänger-Themen 3
Sachinbhatt Was ist die Notwendigkeit eines Sammlungsframeworks in Java? Java Basics - Anfänger-Themen 2
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Inhalt eines Arrays ausgeben Java Basics - Anfänger-Themen 7
A Jedes zweite Element eines Arrays entfernen Java Basics - Anfänger-Themen 30

Ähnliche Java Themen

Neue Themen


Oben