绘制隐藏的Java swing组件

时间:2014-06-30 15:06:23

标签: java swing user-interface jframe paintcomponent

我尝试将组件绘制为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。但这无济于事。

3 个答案:

答案 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);