Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我怎么能?”;包装();一个可打印的JavaSwing组件?_Java_Swing_Printing_Layout Manager - Fatal编程技术网

“我怎么能?”;包装();一个可打印的JavaSwing组件?

“我怎么能?”;包装();一个可打印的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

我已经实现了一个Java Swing组件,该组件实现了
可打印的
。如果我将组件添加到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。