2011-02-14 16 views
0

アプレットが読み込まれたページが読み込まれるときJTableオブジェクトのコンテンツは完全にレンダリングされます。タブを閉じて再び開くと、最初のコンテンツセットがレンダリングされますが、setValeAt()テーブルを介して変更されたコンテンツが空になると、データモデルからすべてのhtmlタグを削除すると、すべてが機能します。私はテーブルのデフォルトのレンダラーだけで黙示的なデータモデルを何もしません。すべての値はsetValeAt()で設定され、動作します(私はそれをチェックしました)。 誰かが何が間違っている可能性があると思いますか?JTableはレンダリングしません

エラーを再現するサンプルコードを示します。アプレットを実行して(値は変更されます)、タブ(ブラウザではない)を閉じてから再度開きます。 LinuxとWindows XPのFirefox 3.6.13とJava 1.6.0_22-b04でテストしました。それは同じように動作します。

import javax.swing.JApplet; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

public class test extends JApplet 
{ 
    class model extends AbstractTableModel 
    { 

     @Override 
     public int getColumnCount() 
     { 
      return 3; 
     } 

     @Override 
     public int getRowCount() 
     { 
      return 3; 
     } 

     @Override 
     public Object getValueAt(int arg0, int arg1) 
     { 
      return "<html><b>" + Math.random() + "</b></html>"; // does not work 
      //return "" + Math.random(); // work 
     } 

     public void setValueAt(Object newValue, int row, int col) 
     { 
      fireTableCellUpdated(row, col); 
     } 
    } 

    JTable t = new JTable(); 

    public void init() 
    { 
     t.setModel(new model()); 
     add(t); 
    } 

    public void start() 
    { 
     new Thread(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       int i=0; 
       try 
       { 
        while(++i<100) 
        { 
         Thread.sleep(100); // thanks to camickr 
         t.setValueAt(Void.class, (int)(Math.random()*10) %3, (int)(Math.random()*10) %3); 
        } 

       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 

EDIT:

HTMLアプレットコード

 
<applet width="500px" height="500px" alt="test test test" code="test.class">
</applet>

index.html内部コンパイルコード: javac test.java

は生成:ファイルtest$1.class test.class test$model.class

初めて実行してもOKです。新しいタブを作成し、アプレットタブを閉じます。アプレットタブを開く(ブラウザを閉じないでください)、テーブルの内容はレンダリングされません。

EDIT 2
ITは、JVMのバグです! http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6995386などを参照してください。 JRE 1.6.0_22にのみ影響する

答えて

1

XPでJDK6_7を使用して問題を再現できませんでした。

値は、モデルに各アップデート後に寝ていないので、値が変化し続けるません

を変更します。私は少しコードを変更しました:

// Thread.sleep(100); 

while(++i<100) 
{ 
    t.setValueAt(Void.class, (int)(Math.random()*10) %3, (int)(Math.random()*10) %3); 
    Thread.sleep(500); 
} 
+0

あなたは間違いありません。この奇妙な行動を確認しますか? – BeginEnd

関連する問題