我尝试将组件绘制为PDF。我有itextpdf 4.2,一切都很完美。 但这只有在我看到我试图渲染的帧时才有效。
我发现的类似问题How to paint an invisible JFrame elsewhere?有同样的问题,但答案中没有提供解决方案。
一些代码。 我创建了 JFrame 并插入了我要渲染的主视图。
JFrame jframe = new ShowingFrame();
jframe.setPreferredSize(new Dimension(PDFHelper.getOriginalWidth().intValue(), PDFHelper.getOriginalHeight().intValue()));
jframe.setMinimumSize(new Dimension(PDFHelper.getOriginalWidth().intValue(), PDFHelper.getOriginalHeight().intValue()));
jframe.add(view);
jframe.setUndecorated(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setState(Frame.ICONIFIED);
jframe.setState(Frame.NORMAL);
//jframe.setVisible(true);
如果我取消注释jframe.setVisible(true)
,那么一切正常。
但是用户会看到我想要避免的这个框架。
所以问题是:如何绘制隐藏的控件?
在Swing Component.java类中,所有绘制方法首先检查组件是否可见:
public void paint(Graphics g) {
if (isShowing()) {
// rest of the code...
}
}
我尝试创建继承类ShowingFrame extends JFrame
,覆盖 isShowing 并始终返回true。但这无济于事。
答案 0 :(得分:2)
Swing(和Java Graphics API)已经过优化,可以尽快停止渲染。
因此,解决方案是创建BufferedImage
,从中获取Graphics
实例,然后使用它调用component.paint(g);
。
现在你有了一个标签组件。尝试获取选项卡的内容,而不是呈现选项卡本身。如果这不起作用,您可以尝试克隆子树,创建新的JPanel
,附加子项并呈现结果。但如果模型表现不佳,克隆就会变得乏味。
请参阅此问题以获取一些代码:Swing: Obtain Image of JFrame
答案 1 :(得分:1)
为什么要画一些看不见的东西?您的计算机不希望浪费CPU周期来渲染无法看到的图形。事实上,有很多计算方法可以看到每个窗口的哪些部分是可见的,只绘制可见部分(所谓的剪辑窗口)。
如果你想画一些东西,以便以后可以使用它或保存它,你总是可以创建一个你想要的大小BufferedImage
并绘制到那个。
答案 2 :(得分:1)
如果我取消注释jframe.setVisible(true),那么一切正常。但是用户会看到我想要避免的这个框架。
您可以设置框架位置,使其在屏幕上不可见。也许是这样的:
frame.pack();
Dimension d = frame.getSize();
frame.setLocation(-d.witdh, 0);