我刚刚开始学习使用 Java Swing 进行打印,所以如果这个问题非常幼稚,请耐心等待。
我有一个相当复杂的布局,其中包含多个 JPanel,其中包含其他包含 JLabels 的 JPanel。我想以某种方式在打印机上很好地打印这个。
我知道我可以在代表打印页面的 Graphics2D 对象上“绘画”,但这需要我单独定位每个对象。我希望能够使用 Swing 布局管理器来布局页面上的项目。一种方法是调用 jp.paint(g2d),其中 jp 是 JPanel,g2d 是表示打印页面的 Graphics2D 对象。但是,据我所知,这只会打印屏幕上实际可见的 JPanel。如果 JPanel 不可见,则不会打印它。
那么有没有什么方法可以布局一个(相当复杂的)JPanel 并将其发送到打印机,而无需先在计算机屏幕上显示 JPanel?
还是我完全走错了路?
最佳答案
如何在不可见时打印 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)
打印机:
关于java - 打印多个 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9873317/