“我怎么能?”;包装();一个可打印的JavaSwing组件?
我已经实现了一个Java Swing组件,该组件实现了“我怎么能?”;包装();一个可打印的JavaSwing组件?,java,swing,printing,layout-manager,Java,Swing,Printing,Layout Manager,我已经实现了一个Java Swing组件,该组件实现了可打印的。如果我将组件添加到JFrame,并执行this.pack()在JFrame上,它可以完美打印。但是如果我不将组件添加到JFrame,只会打印一个空白页 这段代码提供了一个很好的打印输出: final PrintablePanel p = new PrintablePanel(pageFormat); new JFrame() {{ getContentPane().add(p); this.pack(); }}; job.setPr
可打印的
。如果我将组件添加到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?该面板正在使用多个布局管理器
我尝试了p.validate()代码>和p.重新验证()代码>但它不工作。有什么建议吗?或者我必须在打印组件之前将其添加到隐藏的JFrame中吗
更新:如果我这样做p.doLayout()代码>打印某些部件,但不打印子部件。以及以下文件:
使此容器布局其组件。大多数程序不应该直接调用这个方法,而是应该调用validate方法
但是p.validate()代码>不适用于我。您可以使用,这将导致调用;或者,直接使用
@TacB0sS似乎提出了一个很好的观点:就是不要调用;本文件仅供参考 validateTree()
不是可见的方法。invalidate()
和validate()
不起作用的原因可能是它们跳过了不可见的组件。没错,validateTree()
受保护。使用validate()
并渲染到buffereImage
中是否有问题?不,组件似乎需要位于顶级容器中才能validate()
。看啊哈JFreeChart可以在无头模式下渲染到
BuffereImage',但它不是JComponent
。是的,渲染到BuffereImage
没有问题。或者只覆盖paintComponent()
。但我的整个想法是使用LayoutManager来创建“文档”,所以我不必像Java2D那样编写像素值。我需要调用validate()
,这样布局就可以完成它的工作了。您是否尝试重新绘制它?是否设置了面板大小??是的,大小和首选大小在JPanel的构造函数中设置。但是它没有帮助:(你的面板上有什么?组件/图像除了有一个幽灵帧有什么可怕之外?@TacB0sS:我有很多组件,主要是JComponents、jlabel和JTextFields。