打印一些JPanels

时间:2012-03-26 13:46:29

标签: java swing printing

我刚刚开始学习使用Java Swing进行打印,所以如果这个问题非常幼稚,请耐心等待。

我有一个相当复杂的布局,其中包含多个JPanel,其中包含其他包含JLabel的JPanel。我想以某种方式在打印机上很好地打印出来。

我知道我可以"画"在代表打印页面的Graphics2D对象上,但这需要我单独定位每个对象。我希望能够使用Swing布局管理器来布局页面上的项目。一种方法是调用jp.paint(g2d),其中jp是JPanel,g2d是表示打印页面的Graphics2D对象。但是,据我所知,这只会打印一个在屏幕上实际可见的JPanel。如果JPanel不可见,则不会打印。

那么有没有办法布局一个(相当复杂的)JPanel并将其发送到打印机而不先在计算机屏幕上显示JPanel?

或者我在这里完全错误的轨道?

1 个答案:

答案 0 :(得分:2)

简化了如何在不可见的情况下打印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