2010-12-02 11 views
9

私は書いたjavaアプレットを持っていて、かなり長い間それを実行しています。アプレットでは、テキストコンテンツにHTMLを使用するJLabelがたくさんあります(これは許可されており、何年も働いています)。 HTMLを使用する主な理由は、JLabelで改行を許可することです。JLabel(およびその他のコンポーネント)でHTMLが動作しなくなった

問題:かなり最近、HTMLを含むJLabels(一部ではない)がテキストの表示を停止しました。私はそれが100%確実ではない最近のJavaアップデート(Java SE 6 Update 22、2010年10月12日)と何か関係があるかもしれないと思っていますが、その問題はその周りから始まったようです。バグが導入された可能性はありますか?または機能が削除されましたか?

JEditorPaneで試したところ、コンテンツがHTMLの場合と同じ問題があるようでした。

また、最初にアプレットを読み込んだとき(初めてJavaランタイムが起動したとき)はFINEになっていますが、Webページを最新表示すると、説明されている問題が発生します。

誰も同じような問題がありますか?誰にも洞察はありますか?または私はちょうど何かばかなことをしていますか?

私は非常に簡単なテストアプレットを作って、私は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); 
    } 
} 

[HellowWorldApplet.html]

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

PS。私は主にChromeを使用してテストしてきましたが、私はIE 8でも巧みに試しました。 また、私は(明らかに)最新のJava SE 6アップデート22を自分の実行時としてインストールし、私のJDKに対応するアップデートを持っています。上記のテストアプレットを単純に "javac HelloWorldApplet.java"

+0

私はちょうど私がその新しいスレッドを生成別のテストをしました毎秒ラベルをループして更新し、増加するintカウントを示します。 intが偶数の場合でも、HTMLでラベルを更新し、intが奇数の場合、Text(No HTML)でラベルを更新します... HTMLで更新されたときには何も表示されません。テキストが正しく表示されます。 HTMLに何か問題があります。他に誰もこのような問題を抱えているとは思わないでしょうか? – devlop

+0

ラベルの.putClientProperty( "html.disable"、Boolean.TRUE)を呼び出すと、htmlが表示されます(もちろん、テキストとして表示されます。つまり、html自体を解釈するのではなく表示します。が望ましい)。しかし、JLabelが正しく描画しているというもう一つの証拠は、htmlを解釈していないだけです。 – devlop

答えて

7

、以下のバグレポートhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6993691

を参照してくださいバグレポートの回避策は次のとおりです。

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); 
    } 
} 
+0

Awwはい!おかげで、あなたの午後にこれを費やして申し訳ありませんが、私は超感謝しています。私はバグのデータベースを調べてみましたが、そのバグは見つかりませんでした。少なくともそれはバグだったし、私は狂っていなかった。もう一度、ありがとう。 – devlop

+0

実際に私はあなたに感謝すべきです:)私は古代(主にAWTベースの)アプレットを拡張するときにこの動作に遭遇しました。ありがたいことに私はあなたのポストを数時間後に発見し、もう一つはJava bugtrackerにリンクするstackoverflowに... – kolmis

+1

ありがとう。あなたは私のアプレットを保存しました。 :P – gd1

0

というスレッドの問題のような音からコンパイルします。

残念ながら、アプレットは構築されておらず、AWT Event Dispatch Thread(EDT)で呼び出されたライフサイクルメソッドもありません。

技術的には、コンストラクタとinitコードはjava.awt.EventQueue.invokeAndWait内で実行する必要があります。この原因を探して午後を無駄

+0

簡単にするために、上記の例を元のものから簡略化しました。あなたの答えに応じて、私は2つのthis.add()呼び出しをinvokeAndWait(新しいRunnable(){public void run(){...}})呼び出しでラップしようとしましたが、それでも同じ問題があります。 – devlop

+0

また、新鮮なランタイムですべて正常に動作することが面白いですが、実行中のランタイムで連続して実行されると問題が発生します。スレッドに関する問題はいつも起こると思いますが、私はそれについて間違っている可能性があります。 – devlop

+0

@devlopスレッディングはタイミングについてです。初回の初期化は遅くなる可能性があるため、タイミングが完全に異なる範囲がたくさんあります。 –