我的应用程序在JEditorPane中显示RSS条目。它的效果还不错,但是最近在显示gif时遇到了一个严重的问题。这是一个小测试用例:
public class JEditorPaneTest
{
public static void main(String[] args)
{
JFrame dialog = new JFrame("JEditorPane test");
dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = dialog.getContentPane();
c.setLayout(new BorderLayout());
JEditorPane editorPane = new JEditorPane();
editorPane.setEditorKit(new HTMLEditorKit());
editorPane.setText("<html><body><img src=\"http://feeds.feedburner.com/~ff/MacRumors-All?d=yIl2AUoC8zA\"></body></html>");
c.add(new JScrollPane(editorPane), BorderLayout.CENTER);
dialog.pack();
dialog.setVisible(true);
}
}
未经动画处理的gif闪烁,在Mac OS X上,CPU使用率高达300%(四核计算机),在Windows 7上,CPU使用率高达50%。此问题甚至更为严重,因为在放置编辑器窗格后,CPU使用率为仍然那么高。
[看一些分析,看起来cpu使用时间的50%在事件分发程序线程中,而其他50%在sun.awt.image.ImageFetcher.run()中。
另一个有趣的事实是,将HTML嵌入JLabel时也会发生。
((编辑:2012年3月9日),另一个有趣的事实是,如果该文件首先在本地下载(并由file:// ...访问),或者甚至作为一种资源都无法解决任何问题。但是,如果图像显示在JLabel的ImageIcon中,则不会出现闪烁和CPU使用率过高的情况。我确实需要以某种方式在JEditorPane中使用HTML文档来呈现一些基本的HTML格式。
我正在寻找一种通用的解决方案,以免检查feedburner.com上的图像,而feedburner.com上的这些gif是我发现的唯一图像,但我想避免所有其他行为相同的图像出现错误方式。
非常感谢。
使用HttpURLConnection从网站获取图像。
将图像另存为gif文件到本地驱动器。
在您的editorPane.setText方法中尝试:
<html>
<body>
<img src="images/picture.gif">
</body>
</html>
图像源指向您保存的gif文件的位置。
我知道这已经很老了,但是我在另一个项目的JEditor窗格中也遇到了CPU使用率过高的问题,因此我决定尝试一下您的测试用例。到adding debugging to the event queue,我确定它正在不断重画屏幕,因为该特定图像是动画gif。它可能看起来没有动画,但实际上是动画gif。
如果将其转换为未动画的gif或PNG,它将解决此问题。