2012-03-26 16 views
1

Ich fange gerade an, über das Drucken mit Java Swing zu lernen, also bitte ertragen Sie mit mir, wenn diese Frage sehr naiv ist.Drucken einer Reihe von JPanels

Ich habe ein ziemlich komplexes Layout mit mehreren JPanels, die andere JPanels enthalten, die JLabels enthalten. Ich möchte das irgendwie gut auf einem Drucker drucken.

Ich weiß, dass ich auf einem Graphics2D-Objekt "malen" kann, das eine gedruckte Seite darstellt, aber das erfordert, dass ich jedes Objekt einzeln positioniere. Ich würde gerne die Layout-Manager von Swing verwenden können, um die Elemente auf meiner Seite zu gestalten. Eine Möglichkeit dazu besteht darin, jp.paint(g2d) aufzurufen, wobei jp ein JPanel und g2d das Graphics2D-Objekt ist, das die gedruckte Seite darstellt. Soweit ich sehen kann, wird jedoch nur ein JPanel gedruckt, das tatsächlich auf dem Bildschirm sichtbar ist. Wenn JPanel nicht sichtbar ist, wird es nicht gedruckt.

Gibt es also eine Möglichkeit, ein (ziemlich komplexes) JPanel zu erstellen und es an einen Drucker zu senden, ohne zuerst das JPanel auf dem Computerbildschirm anzuzeigen?

Oder bin ich hier völlig falsch?

+1

Dies wird Ihnen helfen -> http://docs.oracle.com/javase/tutorial/2d/printing /gui.html – Java42

+0

Nein, soweit ich sehen kann, geht es um das Drucken eines sichtbaren Objekts. Ich möchte ein unsichtbares Objekt drucken. – oz1cz

+0

Wenn Sie die zu druckenden Bereiche erstellen, führen Sie pack(), aber nicht Visible (true) aus, und das Bedienfeld wird gedruckt, ohne auf dem Bildschirm angezeigt zu werden. Versuche es. – Java42

Antwort

1

Beispiel, wie man ein JPanel unsichtbar drucken kann.

public class TestPrinterSmall { 
static class JPanelPrintable extends JPanel implements Printable { 
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException { 
     if (page > 0) return Printable.NO_SUCH_PAGE; 
     printAll(g); 
     return Printable.PAGE_EXISTS; 
    } 
}; 
private static void printIt(Printable p) throws PrinterException { 
    PrinterJob job = PrinterJob.getPrinterJob(); 
    job.setPrintable(p); 
    if (job.printDialog()) job.print(); 
}  
public static void main(String args[]) throws PrinterException { 
    final JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    f.setSize(400,400); 
    final JPanelPrintable j = new JPanelPrintable(); 
    j.setLayout(new BorderLayout()); 
    j.add(new JButton("1111"),BorderLayout.NORTH); 
    j.add(new JButton("2222"),BorderLayout.SOUTH);    
    f.add(j);f.repaint();f.pack(); 
    //f.setVisible(true); 
    printIt(j); 
} 
} 

Ausgang:

(nothing) 

Drucker:

enter image description here

+0

Das ist perfekt, Chuck. Ich verstehe immer noch nicht, warum mein Code nicht funktioniert, aber jetzt habe ich wenigstens etwas, mit dem ich arbeiten kann. Vielen Dank. – oz1cz