Drucken von JPanel mit richtiger Skalierung

Eule

Mitglied
Guten Tag Forum,

ich beschreibe mal kurz mein Problem ohne Code:

Ich möchte ein JPanel drucken in welchem 6 Diagramme plaziert sind. Die Anordnung ist in 3 Zeilen und 2 Spalten aufgteilt. Das Diagramm habe ich mit der paint() Methode selbst geschrieben, welche sich das Raster und den Start+Endwert in Abhängigkeit von der Breite des Panels.
Drucke ich jetzt ein Diagramm alleine, also übergebe ihn das Graphics g und lass ihn darauf schreiben, passt er sich perfekt der Größe der Din A4 Seite an und setzt das Raster richtig. Anders ist jedoch, wenn ich das JPanel drucke: Dort ist alles total verzerrt was sich in der Art äußert, dass die momentane Größe des JPanel genommen und der Rest auf der rechten Seite trotzdem noch mit rein gequetscht wird.


Kann jemand mein Problem verstehen, oder muss ich ein Beispiel zusammenprogrammieren? Wäre nicht ganz einfach.

Danke schon mal
Eule
 

André Uhres

Top Contributor
Beispiel zusammenprogrammieren? Wäre nicht ganz einfach.

Hallo Eule,

versuch's mal mit folgendem Beispiel. Zum Skalieren benutzen wir die Methode
Code:
Graphics2D#scale
:

Java:
import java.awt.*;
import java.awt.print.*;
import java.util.logging.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.swing.*;

public class PrintDemo {

    private final ChartsPanel charts;
    private PrintRequestAttributeSet attr;

    public PrintDemo() {
        JFrame f = new JFrame("PrintDemo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 400);
        f.setLocationRelativeTo(null);
        charts = new ChartsPanel();
        f.add(charts);
        f.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                print();
            }
        });
    }

    private void print() {
        PrinterJob pjob = PrinterJob.getPrinterJob();
        pjob.setPrintable(charts);
        charts.setScale(2);
        // create an attribute set to store attributes from the print dialog
        if (attr == null) {
            attr = new HashPrintRequestAttributeSet();
            attr.add(OrientationRequested.PORTRAIT);
            attr.add(MediaSizeName.ISO_A4);
            MediaSize mediaSize = MediaSize.ISO.A4;
            float mediaWidth = mediaSize.getX(Size2DSyntax.MM);
            float mediaHeight = mediaSize.getY(Size2DSyntax.MM);
            attr.add(new MediaPrintableArea(10, 10, mediaWidth - 20, mediaHeight - 20, Size2DSyntax.MM));
        }
        if (pjob.printDialog(attr)) {
            try {
                pjob.print(attr);
            } catch (final PrinterException ex) {
                Logger.getLogger("log").log(Level.SEVERE, null, ex);
            }
        }

    }

    public static void main(final String... args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                PrintDemo printDemo = new PrintDemo();
            }
        };
        SwingUtilities.invokeLater(gui);

    }

    private static class ChartsPanel extends JPanel implements Printable {

        private double scale = 1.0d;//scale factor for printing

        @Override
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            for (int column = 0; column < 2; column++) {
                for (int row = 0; row < 3; row++) {
                    g.drawRect(10 + column * 100 + column * 10, 10 + row * 100 + row * 10, 100, 100);
                }
            }
        }

        public void setScale(final double scale) {
            this.scale = scale;
        }

        @Override
        public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) throws PrinterException {
            if (pageIndex > 0) {
                return NO_SUCH_PAGE;
            }
            Graphics2D g2d = (Graphics2D) graphics;
            g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
            g2d.scale(scale, scale);
            print(graphics);
            return PAGE_EXISTS;
        }
    }
}
Gruß,
André
 

Eule

Mitglied
Hallo André,

danke schon mal für deinen Beitrag. Allerdings ist #scale nicht das was ich suche, da es nur die aktuell angezeigte Größe skaliert. Im Anhang sind zwei Screenshots der PDFs die zeigen was ich meine (ich weiß nicht wie ich das in den Text hier einbaue, deswegen im Anhang).

Bei dem einen Diagramm, wurde es gedruckt, als das Fenster groß war. Das Resultat sind viele Unterlienen und gut zu lesende Schrift. Bei dem anderen Diagramm hingegen wurde das Fenster ganz klein gemacht und dann gedruckt. Die Anzahl der Unterlinien haben sich der Fenstergröße angepasst, wurden jedoch durch das skalieren einfach nur groß gezogen.

Drucke ich ein Diagramm alleine, also übergebe das graphics2D nur dem Diagramm, dann wird es auch immer richtig skaliert (ohne scale zu benutzen):
Java:
printPanel.paint(g)

Füge ich jedoch mehrere Diagramme zu einem JPanel hinzu, wird der Abstand anscheinend nicht aufgeteilt, was mich schon wundert. Dazu der Screenshot mit dem 4 Diagrammen in dem JPanel. Dort war auf dem Bildschirum alles gleichmäßig verteilt. Erstellt habe ich das JPanel ganz normal

Java:
JPanel div6Panel = new JPanel();
div6Panel.setLayout(new GridLayout(2,2));

Chart Antenna1Panel = new Chart();
Chart Antenna2Panel = new Chart();
Chart Antenna3Panel = new Chart();
Chart Antenna4Panel = new Chart();

div6Panel.add(Antenna1Panel);
div6Panel.add(Antenna2Panel);
div6Panel.add(Antenna3Panel);
div6Panel.add(Antenna4Panel);
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Ach so, ich dachte Du hättest nur ein einziges Panel mit sechs Charts. Das sieht ja jetzt so aus, als hättest Du vier Panels mit jeweils nur einem einzigen Chart? Die fügst Du dann mit GridLayout in ein Hauptpanel ein? Und Du druckst das Hauptpanel? Und wenn du nur ein einziges Chart drucken willst, fügst Du sein Panel auch ins Hauptpanel ein und druckst das Hauptpanel? Und wenn Du nicht skalierst, wird das Skalieren vom Drucker gemacht?
??

Gruß,
André
 

Eule

Mitglied
Ups. Entschuldigung für die Verwirrung. Es ist schon so richtig, wie du es in deinem ersten Satz gesagt hast:

Ich habe ein Panel in dem ich direkt 4 (im Prinzip beliebig viele) Diagramme einfüge. Das Panel drucke ich dann aus. der Name Panel ist etwas blöd gewählt, jedoch habe ich die Diagramme von JPanel abgeleitet.

Möchte ich nur ein Chart drucken, habe ich das testweise direkt gemacht, also ohne es vorher in ein Panel einzufügen. So wird es dann auch richtig skaliert.
 

André Uhres

Top Contributor
Ist mir immer noch nicht ganz klar. Am besten Du zeigst etwas mehr Code von Deinen Klassen und Methoden, sowie davon, wie Du druckst. Ich fürchte, sonst reden wir hier aneinander vorbei ;). Alternativ könntest Du vielleicht mein Beispiel so ausbauen, dass es deinem Programm ungefähr entspricht.

Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Swing Drucken von JPanel AWT, Swing, JavaFX & SWT 14
P Jpanel mit Komponenten drucken AWT, Swing, JavaFX & SWT 3
N JPanel nicht ganz drucken AWT, Swing, JavaFX & SWT 2
B Unsichtbares JPanel drucken. AWT, Swing, JavaFX & SWT 14
R JPanel drucken AWT, Swing, JavaFX & SWT 5
G JPanel drucken AWT, Swing, JavaFX & SWT 2
K JPanel drucken AWT, Swing, JavaFX & SWT 4
B JPanel Drucken AWT, Swing, JavaFX & SWT 1
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
I Rich Text drucken AWT, Swing, JavaFX & SWT 0
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
F 2D-Grafik JTextArea drucken bringt mieses Ergebnis AWT, Swing, JavaFX & SWT 2
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
L Charset beim Drucken falsch AWT, Swing, JavaFX & SWT 2
Sugan JavaFX Bilder drucken AWT, Swing, JavaFX & SWT 0
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
F AWT Drucken verschluckt inhalt AWT, Swing, JavaFX & SWT 1
S JTable im Hoch- und Querformat angepasst drucken AWT, Swing, JavaFX & SWT 1
kaoZ JFrame Drucken AWT, Swing, JavaFX & SWT 8
B Drucken der JTextArea AWT, Swing, JavaFX & SWT 4
Z Drucken AWT, Swing, JavaFX & SWT 2
A Swing Drucken eines JTextPanes AWT, Swing, JavaFX & SWT 7
M JTable Drucken NullpointerException +JTable speichern AWT, Swing, JavaFX & SWT 6
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
S AWT Drucken aus bestimmtem Papierfach AWT, Swing, JavaFX & SWT 7
S Probleme beim drucken AWT, Swing, JavaFX & SWT 13
M Swing JTable drucken/Darstellung AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Problem beim Drucken eines Grafik-Objekts AWT, Swing, JavaFX & SWT 2
W AWT Drucken ohne Druckdialog AWT, Swing, JavaFX & SWT 2
O JTable mit Inhalt drucken AWT, Swing, JavaFX & SWT 3
C Swing Briefe/Dokumente zum Drucken erstellen AWT, Swing, JavaFX & SWT 20
D Drucken eines "Formulars" in abgeänderter Form AWT, Swing, JavaFX & SWT 5
T Drucken eines JFrame AWT, Swing, JavaFX & SWT 2
H AWT Oberer Seitenrand kann beim Drucken vom Anwender nicht verstellen werden. AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
A Probleme beim Drucken AWT, Swing, JavaFX & SWT 5
D Vorabberatung :) Briefe gestalten und drucken (als PDF) AWT, Swing, JavaFX & SWT 3
N Nur ein Element sichtbar beim Drucken eines JFrame AWT, Swing, JavaFX & SWT 9
A Probleme beim Drucken (Seite wird abgeschnitten) AWT, Swing, JavaFX & SWT 2
N JTable: Drucken mit größerer RowHeight AWT, Swing, JavaFX & SWT 2
A Probleme mit dem Drucken AWT, Swing, JavaFX & SWT 2
K Seite zum drucken einrichten AWT, Swing, JavaFX & SWT 2
F Drucken in Java AWT, Swing, JavaFX & SWT 3
A Problem mit der Seiteneinrichtung beim Drucken AWT, Swing, JavaFX & SWT 7
A Drucken einer JList AWT, Swing, JavaFX & SWT 4
C JTable drucken AWT, Swing, JavaFX & SWT 7
O Panel drucken AWT, Swing, JavaFX & SWT 2
Y Problem beim Drucken AWT, Swing, JavaFX & SWT 2
A Drucken AWT, Swing, JavaFX & SWT 23
H JTable drucken mit Header AWT, Swing, JavaFX & SWT 4
& XHTML drucken mit (oder ohne) Flying Saucer AWT, Swing, JavaFX & SWT 12
C Fenster rücken beim Drucken in den Hintergrund AWT, Swing, JavaFX & SWT 6
& mehrseitige HTML-Dokumente drucken AWT, Swing, JavaFX & SWT 2
ARadauer jtable drucken unter java 1.3 AWT, Swing, JavaFX & SWT 2
C Text drucken? AWT, Swing, JavaFX & SWT 2
V Drucken in Java AWT, Swing, JavaFX & SWT 2
K Drucken von JTextComponenten AWT, Swing, JavaFX & SWT 2
R Drucken unter jdk 1.4 mit JTable AWT, Swing, JavaFX & SWT 11
B Ein großes JTextPane komplett drucken AWT, Swing, JavaFX & SWT 2
I Drucken: Programm stürzt bei AWT, Swing, JavaFX & SWT 7
I Fensterinhalt drucken AWT, Swing, JavaFX & SWT 2
E Drucken von JComponent. AWT, Swing, JavaFX & SWT 4
F Transparent bzw. transfluent(durscheinend) drucken? AWT, Swing, JavaFX & SWT 2
P Idee zum drucken von JTextField und JTable AWT, Swing, JavaFX & SWT 2
O JTable, mehrere Spalten drucken AWT, Swing, JavaFX & SWT 4
orenishii mehrseitig Images anzeigen und drucken SimpleBook.java AWT, Swing, JavaFX & SWT 5
foobar JTable im Hintergrund drucken AWT, Swing, JavaFX & SWT 2
S Drucken - Bild skalieren AWT, Swing, JavaFX & SWT 2
S JAI und das praktische Drucken AWT, Swing, JavaFX & SWT 4
S Drucken AWT, Swing, JavaFX & SWT 15
S JTable - Drucken AWT, Swing, JavaFX & SWT 10
G HTML aus JEditorPane drucken AWT, Swing, JavaFX & SWT 2
B componente drucken AWT, Swing, JavaFX & SWT 3
M Ein Bild aus einem Panel drucken? AWT, Swing, JavaFX & SWT 11
G Frage zum Drucken AWT, Swing, JavaFX & SWT 2
V Problem beim drucken AWT, Swing, JavaFX & SWT 4
L swing komponenten Drucken AWT, Swing, JavaFX & SWT 7
G JTextPane drucken AWT, Swing, JavaFX & SWT 2
S Drucken eines Panels AWT, Swing, JavaFX & SWT 3
T JEditorPane-content drucken AWT, Swing, JavaFX & SWT 2
T Drucken des Inhaltes einer JTextArea AWT, Swing, JavaFX & SWT 4
J JTextArea drucken AWT, Swing, JavaFX & SWT 4
@ Erzeugen einer Maske zum drucken AWT, Swing, JavaFX & SWT 2
G Drucken?? AWT, Swing, JavaFX & SWT 4
H JTable drucken AWT, Swing, JavaFX & SWT 4
P JTable drucken AWT, Swing, JavaFX & SWT 2
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben