0

アプレットのあるページがロードされると、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にのみ影響します

4

1 に答える 1

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);
}
于 2011-02-14T17:23:58.703 に答える