3

我已经实现了一个 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();对我不起作用

4

1 回答 1

2

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

@TacB0sS 似乎提出了一个很好的观点:根本不要调用setVisible(); 引用此相关的先前问题以供参考。

于 2010-05-25T15:00:27.910 回答