アプレットのあるページがロードされると、JTableオブジェクトのコンテンツが完全にレンダリングされます。タブを閉じて再度開くと、開始時に設定されたコンテンツがレンダリングされますが、setValeAt()
テーブルを介して変更したコンテンツは空になります。データモデルからすべてのhtmlタグを削除すると、すべてが機能します。テーブルのデフォルトのレンダラーは、インペントデータモデルのみを使用します。すべての値はを介して設定されsetValeAt()
、機能します(私はそれをチェックしました)。誰かが何が間違っている可能性があるかを知ることができますか?
エラーを再現するサンプルコードを次に示します。アプレットを実行し(値は変更されます)、タブを閉じて(ブラウザーではなく)、再度開きます。LinuxとWindowsXPのFirefox3.6.13とJava1.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();
}
}
編集:
内部のHTMLアプレットコードindex.html
<applet width = "500px" height = "500px" alt="テストテストテスト"code= "test.class">
</ applet>
コンパイルコード:
javac test.java
生成:ファイルtest$1.class test.class test$model.class
初めての実行はOKです。新しいタブを作成してから、アプレットタブを閉じます。アプレットタブを再度開き(ブラウザを閉じないでください)、テーブルのコンテンツはレンダリングされません。
編集2
それはJVMバグです!http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6995386およびその他の関連を参照してください。JRE1.6.0_22にのみ影響します