gpt4 book ai didi

Java/Swing 离屏渲染(Cobra HTMLPanel -> BufferedImage)问题 : Component doesn't finish redrawing first

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:51 25 4
gpt4 key购买 nike

我正在尝试渲染 Java/Swing Cobra HTML renderer 的内容到屏幕外的 BufferedImage,以便在我的应用程序的其他地方使用:

 slideViewPanel.setDocument(document, rendererContext);
BufferedImage test = new BufferedImage(300,300,BufferedImage.TYPE_INT_RGB);
Graphics g = test.getGraphics();
slideViewPanel.paint(g);

g 中的结果图像显示了部分渲染的页面——有时是设置新文档之前 HTMLFrame 的内容;有时是新文档的半渲染版本。我认为这是因为 Cobra 的 setDocument 方法只是安排文档重新渲染,但我在调试器中单步调试,没有看到第二个线程来重新渲染。有人知道这里可能发生什么吗?

最佳答案

当页面解析完毕后,需要等待所有图片加载完成后才能布局组件。

拦截所有图像加载,以确保在布局组件之前所有图像均已完全加载。我通过覆盖 HtmlDocumentImpl.loadImage 来做到这一点。 (必须子类化 DocumentBuilderImpl 并重写 createDocument 才能使其工作。)我使用信号量等待 image.getWItdh 的结果可用。

我必须围绕解析设置一个计时器,因为某些脚本可能会循环并且永远不会返回。不知道是否有更好的方法来解决这个问题。

关于布局,有大量的 cargo 崇拜和实验导致了下面的截图,所以也许你可以尝试删除一些东西。

            htmlPanel.setVisible(true); 
htmlPanel.setPreferredWidth(DEFAULT_PAGE_WIDTH);
logger.info("Calculating preferred size");

// Get the preferred heigth for the current width.
Dimension psvz = htmlPanel.getPreferredSize();
Dimension min = htmlPanel.getMinimumSize();

logger.info("prf :" + psvz);
logger.info("min :" + min);

// Enlarge to the minimum width (with a limit)
int width = Math.min(MAX_PAGE_WIDTH, Math.max(DEFAULT_PAGE_WIDTH,
psvz.width));
int height = psvz.height;

logger.info("width :" + width);
logger.info("heigth :" + height);

htmlPanel.setSize(width, height);

// actually, htmlPanel is a subclass, and this method exposes validateTree. It may work without it.
htmlPanel.forceValidateTree();

htmlPanel.doLayout();

setImageSize(width);
logger.info("actual size:" + htmlPanel.getSize());

我无法弄清楚 JFrame 对 HtmlPanel 有何作用,以便正确绘制其子项。我必须使用 child 组件进行绘画;即 htmlPanel.getBlockRenderable() 或框架集。

图像是异步绘制的(并且绘制可能会中止),因此在使用 BufferedImage 之前,必须完成所有图像绘制。

我使用了一个委托(delegate)的graphics2d对象来重写所有图像绘制方法来等待绘制完成。

之后,我发现 html 可能会受益于重新布局,因为所有图像尺寸都是已知的,所以我使组件无效并再次进行布局和绘制(或者实际上,我只是调用代码两次......)

之后就可以使用BufferedImage了。也许有更简单的方法。

关于Java/Swing 离屏渲染(Cobra HTMLPanel -> BufferedImage)问题 : Component doesn't finish redrawing first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com