我实现了一个实现Printable
的Java Swing组件。如果我将组件添加到JFrame,并在JFrame上执行this.pack();
,则打印完美。但是,如果我不将组件添加到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中?该面板使用了几个LayoutManagers。
我尝试使用p.validate();
和p.revalidate();
,但它无效。有什么建议?或者在打印组件之前是否必须将其添加到隐藏的JFrame中?
更新:如果我p.doLayout();
打印了一些零件,而不是子零件。并且来自doLayout()
的文档:
使此容器布局其组件。大多数程序不应直接调用此方法,而应调用validate方法。
但p.validate();
不为我工作。
答案 0 :(得分:2)
您可以使用invalidate()
,这会导致validate()
调用validateTree()
;或者,直接使用validateTree()
。
@ TacB0sS似乎有一个好处:只是不要调用setVisible()
;引用此相关previous question以供参考。