アプレットが読み込まれたページが読み込まれるとき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にのみ影響する
あなたは間違いありません。この奇妙な行動を確認しますか? – BeginEnd