Java HTML不再在JLabel(和其他组件)中工作

Java HTML不再在JLabel(和其他组件)中工作,java,applet,Java,Applet,我有一个java小程序,我已经编写并运行了很长一段时间。在applet中,我有一组jlabel,它们在文本内容中使用HTML(这是允许的,并且已经工作了多年)。我使用HTML的主要原因是在JLabel中允许换行 问题:最近,包含HTML的JLabel(有些没有)停止显示文本。我认为这可能与最近的java更新(JavaSE6update22,2010年10月12日)有关,不是100%确定,但问题似乎是从那时开始的。可能是引入了一个bug?或功能被删除 我尝试使用JEditorPane,当内容是HT

我有一个java小程序,我已经编写并运行了很长一段时间。在applet中,我有一组jlabel,它们在文本内容中使用HTML(这是允许的,并且已经工作了多年)。我使用HTML的主要原因是在JLabel中允许换行

问题:最近,包含HTML的JLabel(有些没有)停止显示文本。我认为这可能与最近的java更新(JavaSE6update22,2010年10月12日)有关,不是100%确定,但问题似乎是从那时开始的。可能是引入了一个bug?或功能被删除

我尝试使用JEditorPane,当内容是HTML时,似乎也有同样的问题

还需要注意的是,第一次加载小程序(java运行时第一次启动)时,它工作正常,但如果刷新网页,则会出现上述问题

有人有类似的问题吗?有人有什么见解吗?还是我只是在做些傻事

我制作了一个非常简单的测试小程序,可以100%有规律地重现问题(记住,运行时第一次加载时,它会正常工作,只有连续刷新才会导致问题):

[HelloWorldApplet.java]

import javax.swing.*;

public class HelloWorldApplet extends JApplet
{
    public void init()
    {
        this.add(new JLabel("Hello Everybody (Text)"), java.awt.BorderLayout.NORTH);
        this.add(new JLabel("<html><body>Hello Everybody (HTML)</body></html>"), java.awt.BorderLayout.SOUTH);
    }
}
import javax.swing.*;
公共类HelloWorldApplet扩展了JApplet
{
公共void init()
{
add(新的JLabel(“大家好(Text)”),java.awt.BorderLayout.NORTH;
add(新的JLabel(“大家好(HTML)”),java.awt.BorderLayout.SOUTH;
}
}
[HellowWorldApplet.html]

<html>
<title>A Test</title>
<body>
    <applet code="HelloWorldApplet.class" width="320" height="120">
        You need Java
    </applet>
</body>
</html>

测验
你需要Java
另外,我主要使用Chrome进行测试,但我也在IE 8中进行了短暂的尝试。
另外,我(显然)安装了最新的JavaSE6Update22作为我的运行时,并为我的JDK安装了匹配的更新。我编译上面的测试小程序时使用的是简单的:“javac HelloWorldApplet.java”

听起来像是线程问题

不幸的是,小程序没有构造,或者它们的生命周期方法没有在AWT事件调度线程(EDT)上调用


从技术上讲,您的构造函数和
init
代码应该在
java.awt.EventQueue.invokeAndWait
中执行,浪费了一个下午寻找原因,请参阅下面的错误报告

错误报告中的解决方法是:

import javax.swing.*;
import javax.swing.text.html.parser.ParserDelegator;

public class HelloWorldApplet extends JApplet {
    public void init() {
       ParserDelegator workaround = new ParserDelegator();
       applet.add(new JLabel("Hello Everybody (Text)"), java.awt.BorderLayout.NORTH);
       applet.add(new JLabel("<html>Hello Everybody (HTML)</html>"),  java.awt.BorderLayout.SOUTH);
    }
}
import javax.swing.*;
导入javax.swing.text.html.parser.ParserDelegator;
公共类HelloWorldApplet扩展了JApplet{
公共void init(){
ParserDelegator变通方法=新建ParserDelegator();
add(新的JLabel(“大家好(文本)”),java.awt.BorderLayout.NORTH);
add(新的JLabel(“大家好(HTML)”),java.awt.BorderLayout.SOUTH;
}
}

为了简单起见,我简化了上面的示例(源于原始示例)。然后,为了响应您的回答,我尝试用invokeAndWait(new Runnable(){public void run(){…}})调用包装这两个this.add()调用,但它仍然存在相同的问题。我还发现有趣的是,在一个新的运行时,一切都可以正常工作,但在运行的运行时内连续运行时会出现问题。我认为线程问题总是会发生——尽管我可能不正确。@devlop线程是关于计时的。第一次初始化可能很慢,因此计时有很大的范围可以完全不同。另外值得注意的是,有两个JLabel一个正常工作,另一个不正常,除了字符串内容外,两者都相同(如示例代码所示):一个只是文本,另一个HTML(只有HTML一个不工作).我刚刚做了另一个测试,在那里我生成了一个新线程,它每秒循环并更新标签,显示整数计数在增加。当int为偶数时,我用HTML更新标签;当int为奇数时,我用文本(无HTML)更新标签。。。正如我所期望的那样,当用HTML更新时,标签什么也不显示,当用文本更新时,它会正确地显示文本。HTML有点问题。似乎很难相信没有其他人有这些问题?同时在标签上调用.putClientProperty(“html.disable”,Boolean.TRUE)将导致html显示(当然它将显示为文本,即显示html本身而不是解释它-这不是所希望的)。但这只是JLabel正确绘制的另一个证明,它只是没有解释html!非常感谢,很抱歉你花了一个下午在这上面,但我非常感激。我试着浏览了bugs数据库,但没有找到那个。至少这是一只虫子,我没有发疯。再次感谢,耶。实际上我应该感谢你:)我在扩展一个古老的(主要是基于AWT的)小程序时偶然发现了这种行为,我一直在想我把编码搞砸了。谢天谢地,我在几个小时后找到了你的帖子,然后在stackoverflow上找到了另一篇链接到java bugtracker的帖子……非常感谢。您保存了我的小程序:P