2012-03-26 60 views
1

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

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

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

那么是否有任何方法来布局一个(相当复杂的)JPanel并将其发送到打印机,而不必先在计算机屏幕上显示JPanel?

还是我在一个完全错误的轨道在这里?

+1

这将帮助你 - > http://docs.oracle.com/javase/tutorial/2d/printing/gui.html – Java42 2012-03-26 15:38:16

+0

不,据我所知,这是谈论打印一个可见的对象。我想打印一个看不见的物体。 – oz1cz 2012-03-28 18:40:24

+0

构建要打印的面板时,请执行pack(),但不要设置可见(true),并且面板将打印而不显示在屏幕上。试一试。 – Java42 2012-03-28 19:39:38

回答

1

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

+0

这很完美,查克。我仍然不明白为什么我的代码不起作用,但现在至少我有一些可以使用的东西。非常感谢你。 – oz1cz 2012-03-29 09:48:55