我刚刚开始学习使用Java Swing进行打印,所以如果这个问题非常幼稚,请耐心等待。
我有一个相当复杂的布局,其中包含多个JPanel,其中包含其他包含JLabel的JPanel。我想以某种方式在打印机上很好地打印出来。
我知道我可以"画"在代表打印页面的Graphics2D对象上,但这需要我单独定位每个对象。我希望能够使用Swing布局管理器来布局页面上的项目。一种方法是调用jp.paint(g2d)
,其中jp是JPanel,g2d是表示打印页面的Graphics2D对象。但是,据我所知,这只会打印一个在屏幕上实际可见的JPanel。如果JPanel不可见,则不会打印。
那么有没有办法布局一个(相当复杂的)JPanel并将其发送到打印机而不先在计算机屏幕上显示JPanel?
或者我在这里完全错误的轨道?
答案 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)
打印机: