我如何“打包”()打印可打印的Java Swing组件?

时间:2010-05-25 09:52:37

标签: java swing printing layout-manager

我实现了一个实现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(); 为我工作。

1 个答案:

答案 0 :(得分:2)

您可以使用invalidate(),这会导致validate()调用validateTree();或者,直接使用validateTree()

@ TacB0sS似乎有一个好处:只是不要调用setVisible();引用此相关previous question以供参考。