我已经实现了一个 Java Swing 组件,它实现了Printable
. 如果我将组件添加到 JFrame,并this.pack();
在 JFrame 上执行,它会完美打印。但是,如果我不将组件添加到 JFrame,则只会打印一个空白页。
此代码提供了很好的打印输出:
final PrintablePanel p = new PrintablePanel(pageFormat);
new JFrame() {{ getContentPane().add(p); this.pack(); }};
job.setPrintable(p, pageFormat);
try {
job.print();
} catch (PrinterException ex) {
System.out.println("Fail");
}
但是这段代码给出了一个空白页:
final PrintablePanel p = new PrintablePanel(pageFormat);
// new JFrame() {{ getContentPane().add(p); this.pack(); }};
job.setPrintable(p, pageFormat);
try {
job.print();
} catch (PrinterException ex) {
System.out.println("Fail");
}
我认为这this.pack();
是最大的不同。如何pack()
在我的可打印组件上进行操作,使其打印正常,而不将其添加到 JFrame?该面板正在使用多个 LayoutManager。
我已经尝试过p.validate();
,p.revalidate();
但它不起作用。有什么建议么?还是在打印组件之前必须将其添加到隐藏的 JFrame 中?
更新:如果我p.doLayout();
打印了某些部分,但不打印子组件。并来自以下文档doLayout()
:
使该容器布置其组件。大多数程序不应直接调用此方法,而应调用 validate 方法。
但p.validate();
对我不起作用。