Drucken einer großen Swing-Komponente

Ich habe eine Swing-form mit einem benutzerdefinierten Tabelle in eine JScrollPane (es ist nur ein JPanel, nicht eine JTable Unterklasse), und ich bin versucht, es zu erhalten, zu drucken. Wenn ich senden Sie einfach das ganze Bild an den Drucker, der scroll-Bereich schneidet, und wenn ich die Größe des Rahmens ändern, um die Größe der Inhalte der scroll-Bereich, eine Art innere Barriere hält das JFrame immer mehr, als über 1100 Pixel groß.

Andere alternative wäre die Erstellung der content-Bereich des Dialogfelds, ohne die Anbringung an der Wurzel JFrame, weil die JPanel die Größe ist nicht beschränkt, in diesem Fall. Aber, um die Komponenten zu legen, sich selbst und die Größe, um Ihren richtigen Größen, die ich zu benötigen scheinen, um das Fenster displayable, was bedeutet, dass zumindest hinzufügen, um einen JFrame und aufrufenden JFrame.pack(), aber wieder, die 1100 pixel limit kommt zurück.

Hier ist mein code für das drucken der Komponente:

public static void print(final Component comp) {
    final float SCALE = .5f;
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(new Printable() {
        public int print(Graphics g, PageFormat pf, int page)
            throws PrinterException
        {
            if (page * pf.getImageableHeight() >= SCALE * comp.getHeight())
                return NO_SUCH_PAGE;
            ((Graphics2D)g).translate(pf.getImageableX(), pf.getImageableY()
               - page * pf.getImageableHeight());
            ((Graphics2D)g).scale(SCALE, SCALE);
            comp.printAll(g);
            return PAGE_EXISTS;
        }
    });
    if (job.printDialog())
        try { job.print(); }
        catch (PrinterException ex) {}
}

Wenn ich dies Tue, wird die Komponente hat die Größe null:

JPanel c = createPanel(); //This JPanel has a JScrollPane in it with its
                          //preferredSize equal to that of its viewport component
                          //(which is not what I do to show the dialog normally)
print(c);

Wenn ich dies Tue, wird die Komponente hat die richtige Größe, aber druckt als solide Grau, weil die sub-Komponenten wurden nicht gelegt:

JPanel c = createPanel();
c.setSize(c.getPeferredSize());
print(c);

Diese scheinen nicht zu einen Unterschied machen:

JPanel c = createPanel();
c.validate();
c.revalidate();
c.repaint();
print(c);

Dies ist das panel größer, aber es hält etwa eine Seite und eine Hälfte groß (1100px):

JPanel c = createPanel();
JFrame f = new JFrame();
f.setContentPane(c);
f.pack();
print(c);

Ich bin running out of Permutationen hier. Weiß jemand, entweder (a) so ändern Sie die OS maximale frame-Größe, (b) wie layout und Farbe ein off-screen-Komponente, oder (c) drucken einer Swing Komponente, die direkt, ohne es zu malen (?). Hilfe ist willkommen.

  • d) warum möchten Sie diese ausdrucken? JScrollPane können Sie sehen, dieses große Ding auf dem Bildschirm durch scrollen. Können Sie definieren andere Ansicht für Ihre benutzerdefinierte Tabelle die Daten, die es macht, Druck-freundlich?
  • C auf der rechten Seite sehe ich einige Verwandte post, dort sind links/tutorials zum drucken von 2D-Grafiken und Text JComponents auch, wenn ich das richtig verstanden, dein problem ist berechnen paper DPI versus Pixel (immer) von der sichtbaren Container (JScrollPane mit unbekannten Inhalt)
  • Ich habe keine Probleme mit unvollständigen Informationen - ich kann die Größe meiner Komponenten nur in Ordnung. Das problem ist mit der Malerei - ich bekomme keine undisplayable Komponenten zu malen (wenig überraschend).
  • die Idee ist, dass ich nur die form selbst, und drucken Sie es, anstatt zu erstellen, eine andere version der Formular-Drucker-freundlich. In jedem Fall, ersetzen die JScrollPane mit deren Inhalt direkt in das panel wird nicht funktionieren, aus den gleichen Gründen. Nach dem Austausch, der Inhaltsbereich wird riesig sein, und es wird gequetscht, bis Größe, wenn es gemacht wird, Kš Onnen in einem JFrame (auch wenn nichts gibt es in der layout).
Schreibe einen Kommentar