Печать нескольких JPanels - PullRequest
       2

Печать нескольких JPanels

2 голосов
/ 26 марта 2012

Я только начинаю узнавать о печати с помощью Java Swing, поэтому, пожалуйста, потерпите меня, если этот вопрос очень наивный.

У меня довольно сложный макет с несколькими JPanels, которые содержат другие JPanels, которые содержат JLabels. Я хочу как-нибудь красиво напечатать это на принтере.

Я знаю, что могу «рисовать» на объекте Graphics2D, который представляет напечатанную страницу, но для этого требуется, чтобы я размещал каждый объект по отдельности. Я хотел бы иметь возможность использовать менеджеры разметки Swing для разметки элементов на моей странице. Один из способов сделать это - вызвать jp.paint(g2d), где jp - это JPanel, а g2d - объект Graphics2D, представляющий напечатанную страницу. Однако, насколько я могу видеть, это будет печатать только JPanel, который фактически виден на экране. Если JPanel не виден, он не будет напечатан.

Так есть ли способ создать макет (довольно сложный) JPanel и отправить его на принтер без предварительного отображения JPanel на экране компьютера?

Или я нахожусь здесь на совершенно неверном пути?

1 Ответ

2 голосов
/ 29 марта 2012

Ускоренный пример того, как печатать JPanel, пока он невидим.

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);
}
}

Выход:

(nothing)

Принтер:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...