繁体   English   中英

绘制隐藏的Java swing组件

[英]Paint hidden Java swing component

我尝试将组件绘制为PDF。 我有itextpdf 4.2,一切正常。 但这仅在我使尝试渲染的帧可见时才有效。

我发现的类似问题是如何在其他地方绘制不可见的JFrame? 存在相同的问题,但未提供解决方案。

一些代码。 我创建了一个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。 但这无济于事。

对Swing(和Java Graphics API)进行了优化,以尽快停止渲染。

因此,解决方案是创建一个BufferedImage ,从中获取Graphics实例,然后调用component.paint(g); 用它。

现在,您有了一个选项卡组件。 尝试获取选项卡的内容,而不是呈现选项卡本身。 如果这不起作用,则可以尝试克隆子代树,创建新的JPanel ,附加子代并呈现结果。 但是,如果模型表现不佳,则克隆会变得乏味。

请参见以下问题的一些代码: Swing:获取JFrame的图像

为什么要画一些看不见的东西? 您的计算机不想浪费CPU周期渲染无法看到的图形。 实际上,为了查看每个窗口的哪些部分可见并且仅绘制可见部分(所谓的剪辑窗口),已经进行了大量计算。

如果要绘制某些内容以便以后使用或保存,则可以始终创建所需大小的BufferedImage并进行绘制。

如果我取消注释jframe.setVisible(true),那么一切正常。 但是用户会看到我要避免的框架。

您可以设置框的位置,使其在屏幕上不可见。 也许像这样:

frame.pack();
Dimension d = frame.getSize();
frame.setLocation(-d.witdh, 0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM