Aktuell angezeigtes Drucken

leon_20v

Aktives Mitglied
Hallo,

ich muss in meine Applikation eine Druckfunktion einbauen.

Ich versuche gerade alle Objekte die von JComponent abgeleitet sind mit object.paint(g) in ein Bild zu zeichnen, weilches ich dann gern drucken möchte.

Hier komme ich zum ersten Problem:
Ich habe ein JComponent indem ich ein JTable habe. Warum wird die JTable nicht in das Bild gezeichnet? Allerdings wird das JTable einwandfrei auf dem Bildschirm dargestellt? Was mache ich falsch? Fehlt irgendwas?

Geleiches Problem habe ich bei einem JScrollpane. Auch hier bekomme ich den Inhalt nicht ins Bild. ;(


Desweiteren habe ich das Problem, das ich beim Druck mehr DPI einstellen kann und eine größere Papiergröße.

Wie mache ich es, dass das ganze nicht pixelig wird? Dachte erst an Affine Transformationen und interpoliere das ganze. Allerdings könnte dies ganz schön schimmlig werden.


Vielen lieben Dank für eure Hilfe schonmal ;)
 

Thallius

Top Contributor
Hi,

ich habe die letzten Tage auch damit rumgebastelt. Es gibt da anscheined keinen wirklich guten Weg. Java und Drucken ist "like pain in the ass".
Ein Scollview kann nicht so gedruckt werden. Wie auch du weist ja nicht welche Inhalt sichtbar ist. Du solltest also statt dessen das Panel in dem Scrollview zum Drucken nehmen. Für das JTable gibt es ein eigenes Printable. Wenn du aber das alle kombinieren willst, dann gute Nacht.
Verabschiede Dich davon ein UI ausdrucken zu wollen. Betrache den Druck als eigenes Panel das Du erstellst und dann druckst. Mehr als die 92DPI sind leider auch nicht drin. Alle Funktionen zum Setzen der DPI haben bei mir nichts bewirkt. Komischerweise wird der Text eines printables trotzdem sehr fein gedruckt. Wahrscheinlich macht er da intern irgendwas anders. Bei Grafiken hat man allerdings verloren.
Ich habe es mit einem Fusch geschafft das die besser aussehen, wobei ich nicht die leiseste Ahung habe warum das so ist, denn eine Logik erschließ sich mir da nicht. Mein Print sieht so aus:

Java:
	public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException 
	{
		this.graphics=(Graphics2D)g;
		
		this.graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
		//this.graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		//this.graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
		//this.graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT);
		this.graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
		//this.graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
		//this.graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);
		this.graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		//this.graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
		this.graphics.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
		this.graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
		
		// We have only one page, and 'page'
	    // is zero-based
	    if (page >= this.template.pageList.size()) 
	    {
	         return NO_SUCH_PAGE;
	    }

	    int  x = (int)pageFormat.getImageableX() + 1;
	    int  y = (int)pageFormat.getImageableY() + 1;
	    
	    System.out.println("Print page: "+page);
	    
// die width/12 sind 2cm für den Lochrand.
	    int width=(int)pageFormat.getWidth()-2*x-(int)pageFormat.getWidth()/12;
	    int height=(int)pageFormat.getHeight()-2*y-10;
// scale ist eine feste konstante mit der ich rumprobiert habe. Habe dann mit 4-8 das beste Ergebnis gehabt (Höher wäre es noch besser aber auch langsamer und man sieht es dann nicht mehr finde ich)
	    BufferedImage off_Image =  new BufferedImage(width*scale, height*scale, BufferedImage.TYPE_INT_ARGB);
	    this.graphics = off_Image.createGraphics();
// hier zeichne ich dann meine druckvorlage in das Image mit graphics2D Methoden
	    this.createSheet(width*scale, height*scale, page);

	    g.drawImage(off_Image, x+(int)pageFormat.getWidth()/15, y, width,height, this);
	    //g.translate(x,y);
	    
	    // tell the caller that this page is part
	    // of the printed document
	    return PAGE_EXISTS;
	}

Vielleicht hilft es Dir auch wenn Du dann ebenfalls alles selber zeichnen must. Anders geht es meines Wissens nach einfach nicht.

Alternative könntest du halt noch ein PDF erzeugen wofür es viele gute Frameworks gibt oder ein Formsheet Framework zum Drucken benutzen.

Gruß

Claus
 

leon_20v

Aktives Mitglied
Vielen Dank für deine Antwort,

hab schon sehr viel probiert jetzt und rumgepfuscht, es ist alles ziemlich beschissen. Das mit dem JTable werde ich gleich ausprobieren.

Aktuell versuche ich wie du schon sagtest alles in das Bild zu zeichnen und dann dieses mit Affiner-Transformation zu skalieren. Dies kann halt wirklich ziemlich schimmlig, hässlich werden und pixelig werden.

Das mit dem Scrollpane habe ich mir schon so gedacht, aktuell zeichne ich wirklich das komplette Pane, jetzt muss ich aber die kompletten abstände neu berrechnen.

Das mit dem "graphics.translate(x,y)" ist auch so ne sache. Ich habe mir jetzt jedesmal ein neues graphics objekt erstellt. Damit kann ich immer frisch ne translation setzen. Alles andere da rumrechnen ist irigendwie Käse und sau kompliziert.
 

leon_20v

Aktives Mitglied
hmmm... wenn ich das panel zum druck erstelle und ich z.b. auf ein A3 Blatt drucken will, dann muss ich doch die Elemente größer Zeichnen.

Wenn ich jetzt objekt.setBounds(..) mache, dann zeichnet es mir doch auch die UI größer. Also müsste ich die Objekte kopieren. Ich weiß aber nicht wie ich das anstellen soll. Das Projekt ist ziemlich groß und die Objekte können ziemlich viel und haben ziemlich viele und ziemlich wirre Verbindungen(ich bin in das Projekt geworfen worden ;( ).
 

leon_20v

Aktives Mitglied
Hallo nochmal,

ich habe nur Probleme mit dem Drucken. Ich frag mich echt warum Java alles so kompliziert macht.


Wenn ich folgenden Code ausführe, kann ich im Dialog Druckeinstellungen setzen (Querformat, Papiergröße usw)

Ich möchte jetzt mein Bild darauf anpassen. Wie kann ich mir jetzt die Einstellungen geben lassen. Ich finde einfach keine Lösung. Bitte um Hilfe

Java:
PrinterJob pjob = PrinterJob.getPrinterJob();
    
            if (pjob.printDialog() == false)
                return;
            pjob.setPrintable(this);
           
            pjob.print();
        } catch (Exception e) {
            e.printStackTrace();
        }
 

leon_20v

Aktives Mitglied
ja das hab ich schon, dann kann ich ja mit

Java:
 double cm =  pageFormat.getImageableWidth() / 72 * 2,54;

die cm berechnen für die Breite z.b.?


So jetzt hast du gesagt in Java läuft alles mit 72dpi.

Jetzt muss ja mein Bild das z.B. 1000x800px hat skalieren damit es genau auf das vom Benutzer ausgewähltem Papier passt.

Wie rechne ich das am besten um?
 

Thallius

Top Contributor
Wie gesagt das wird so nichts da das Bild in 72DPI grausam pixelig aussehen wird. Wenn du es unbedingt probieren willst, dann must du ja wissen wieviel DPI Dein Bild hat damit du es runterrechnen kannst. Die Pixel des Bildes nutzen Dir da ja gar nichts.

Du wirst entweder ein Report Framework wie JasperReport nehmen müssen, was eine sehr hohe Einarbeitungszeit hat, dafür aber auch extrem mächtig ist oder Du zeichnest alles selber in einen ImageBuffer der 4-8mal so groß ist wie das PageFormat angibt und transformierst es dann runter wie ich bereits in meinem Demo Code geschrieben habe.
Fertige Panels/Buttons/Tables etc und Bilder mischen geht einfach nicht.

Gruß

Claus
 

leon_20v

Aktives Mitglied
Runtertransformieren kann nichts, hab ich versucht. Das wird mega schlecht.

Ich muss jetzt die AWT-EventQue stoppen, die JComponents skalieren, diese in dann in das Bild zeichnen und dann wieder zurücksetzen bevor der Monitor aktualisiert wird...


Ein Bild erstellen und das dann zu skalieren sieht iwi immer schlecht aus, auch wenn ich die Seitenverhältnisse beibehalte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
Z Welches GUI Framework für Java ist aktuell? Allgemeine Java-Themen 16
D Aktuell installierte Java Version auslesen unter Windows Allgemeine Java-Themen 5
G Java Cryptography Extension (JCE) mit Java 1.6 noch aktuell? Allgemeine Java-Themen 1
F JSP noch aktuell? Allgemeine Java-Themen 5
J Name des aktuell aktiven Windows-Fensters abfragen? Allgemeine Java-Themen 4
OnDemand Drucken / Druckserver Allgemeine Java-Themen 13
M Drucken drawString(); Allgemeine Java-Themen 1
M Drucken ohne Dialog Allgemeine Java-Themen 1
M Drucken von Dateien Allgemeine Java-Themen 10
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
T Drucken einer PDF Datei Allgemeine Java-Themen 4
S Input/Output Drucken Allgemeine Java-Themen 2
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
T Drucken von JPanel Allgemeine Java-Themen 4
F Mehrere JTables' drucken Allgemeine Java-Themen 0
B JTextArea 6 mal auf DinA4 Format verteilen und drucken Allgemeine Java-Themen 1
Androbin Drucken in Java - Größen- und Positionsprobleme Allgemeine Java-Themen 3
E Drucken einer Pdf Datei unter Java. Allgemeine Java-Themen 1
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
Thallius Drucken mit Logo Allgemeine Java-Themen 2
Thallius Drucken mit Templates Allgemeine Java-Themen 3
S PDF-Generierung und Drucken Allgemeine Java-Themen 11
A Drucken auf theoretisch unendlich langer Seite Allgemeine Java-Themen 2
M Fehlende Zeichen beim Drucken mit PDFBox Allgemeine Java-Themen 10
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
B Drucken (Inhaltsverzeichnis usw.) Allgemeine Java-Themen 4
F Drucken von Escape-Sequenzen Allgemeine Java-Themen 11
H Drucken von Belegen (Belegdrucker: EPSON TM-T88III Allgemeine Java-Themen 2
W Input/Output Drucken ohne GUI Allgemeine Java-Themen 11
C PDF Dateien mit Java drucken Allgemeine Java-Themen 2
R PDF duplex drucken Allgemeine Java-Themen 3
A Drucken auf kleine Formate Allgemeine Java-Themen 2
sylo PageFormat - Das Problem mit dem Drucken Allgemeine Java-Themen 5
M Drucken hilfe Allgemeine Java-Themen 4
Y Drucken mit Java Allgemeine Java-Themen 2
M aus Datei drucken Allgemeine Java-Themen 5
M Problem beim Drucken von PDFs Allgemeine Java-Themen 3
T Drucken von variabel langen Listen (es kommen nur leere Seiten raus) Allgemeine Java-Themen 2
A Drucken ändert aktuelles Verzeichnis Allgemeine Java-Themen 2
S Drucken ohne Rand Allgemeine Java-Themen 3
A Drucken einer JList Allgemeine Java-Themen 3
D pdf mit iText drucken Allgemeine Java-Themen 4
K SWT OpenOffcie Dokument drucken Allgemeine Java-Themen 8
V Drucken von Listen Allgemeine Java-Themen 6
J xls Datei drucken mit Java Allgemeine Java-Themen 10
A HTML-Seite aufrufen, drucken und zum Programm zurückkehren Allgemeine Java-Themen 2
J Drucken mit drawString() und Zeilenumbruch Allgemeine Java-Themen 3
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
P JTable drucken Allgemeine Java-Themen 8
U Dokumente als PDF "drucken" Allgemeine Java-Themen 3
T Drucken mit PrintJob und Einstellungen merken Allgemeine Java-Themen 3
O Mehrseitiges Drucken Allgemeine Java-Themen 5
V Datei Drucken Allgemeine Java-Themen 19
D Inhalt der JTextArea drucken Allgemeine Java-Themen 2
S Problem beim Drucken auf Netzwerkdrucker unter Linux Allgemeine Java-Themen 9
R Drucken über bestimmten Drucker Allgemeine Java-Themen 11
V Probleme beim Drucken mehrerer PDF's Allgemeine Java-Themen 17
Zed Tool zum drucken von Sourcecode Allgemeine Java-Themen 9
G diagramm drucken Allgemeine Java-Themen 3
J Drucken über Java oder OOo empfehlenswert? Allgemeine Java-Themen 15
W Drucken in Graustufen Allgemeine Java-Themen 4
F Frage zum Drucken Allgemeine Java-Themen 4
G Drucken einer GUI-Komponenter ? Allgemeine Java-Themen 4
Lazybone iText und Drucken Allgemeine Java-Themen 5
G Drucken mit Laserdrucker Allgemeine Java-Themen 5
Lazybone Rechnung erstellen und Drucken Allgemeine Java-Themen 19
G Drucken in Java Allgemeine Java-Themen 3
M Drucken Allgemeine Java-Themen 2
M Drucken Schacht auswählen/bestimmen Allgemeine Java-Themen 2
P Drucken Allgemeine Java-Themen 9
T OO zum drucken/convertieren ohne Socket Allgemeine Java-Themen 8
M Drucken mit BufferedImage Allgemeine Java-Themen 9
S hilfe für drucken Allgemeine Java-Themen 4
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
D Masken drucken Allgemeine Java-Themen 13
C von Java aus ein Dokument im Browser drucken Allgemeine Java-Themen 11
L Per IText erstelltes PDF automatisch drucken Allgemeine Java-Themen 13
G Drucken Allgemeine Java-Themen 9
L Rechnungen in Java erstellen & drucken Allgemeine Java-Themen 23
G iText: Problem beim Drucken von AcroFormen Allgemeine Java-Themen 2
André Uhres Drucken: Printer is not accepting job Allgemeine Java-Themen 3
F PostScript mit Java "drucken" Allgemeine Java-Themen 12
G Das aktuelle Fenster drucken Allgemeine Java-Themen 13
T PDF drucken: "invalid flavor" Allgemeine Java-Themen 8
R Rechnung aus Java heraus erstellen und drucken Allgemeine Java-Themen 8
T Drucken von RTF-Dokumenten? Allgemeine Java-Themen 11
H Drucken unter Linux funktioniert nicht Allgemeine Java-Themen 2
A Nochmals Drucken Allgemeine Java-Themen 2
N Drucken+Papiergröße Allgemeine Java-Themen 9
B Daten zum Drucken aufbereiten Allgemeine Java-Themen 8
S Text optimal drucken Allgemeine Java-Themen 2
G drucken von html-code Allgemeine Java-Themen 2
S drucken unter j2sdk-1.4 möglich; unter jdk1.5 nicht; warum? Allgemeine Java-Themen 4
M Problem mit PageFormat beim Drucken Allgemeine Java-Themen 2
S Drucken!er druckt es zu groß aus! Allgemeine Java-Themen 5
S Drucken! Allgemeine Java-Themen 2
A Prof. Lib fürs Drucken Allgemeine Java-Themen 5
J Eine Rechnung speichern vom Drucken Allgemeine Java-Themen 3
J vorm Drucken speichern Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben