JTable не отображает - PullRequest
       7

JTable не отображает

0 голосов
/ 14 февраля 2011

Когда загружена страница с апплетом, содержимое объекта JTable отображается идеально. Когда я закрываю вкладку и открываю ее заново, отображается содержимое, установленное при запуске, но когда содержимое, которое я изменил с помощью таблицы setValeAt(), становится пустым. Когда я удаляю все HTML-теги из модели данных, все работает. Я ничего не делаю с таблицей по умолчанию рендерер только реализовать модель данных. Все значения устанавливаются через setValeAt(), и это работает (я проверил это). Может кто-то иметь представление, что может быть не так?

Вот пример кода, который воспроизводит ошибку. Запустите апплет (значения будут меняться), затем закройте вкладку (НЕ браузер) и снова откройте ее. Я тестировал его в Firefox 3.6.13 и Java 1.6.0_22-b04 в Linux и Windows XP. Он действует так же.

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-код апплета внутри index.html

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

Код компиляции: javac test.java

производит: файлы test$1.class test.class test$model.class

Запуск в первый раз ОК. Создайте новую вкладку и закройте вкладку апплета. Снова откройте вкладку апплета (не закрывайте браузер), и содержимое таблицы не отобразится.

РЕДАКТИРОВАТЬ 2
Это ошибка JVM! см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6995386 и другие связанные. Это влияет только на JRE 1.6.0_22

1 Ответ

1 голос
/ 14 февраля 2011

Не удалось воспроизвести проблему с помощью JDK6_7 в XP.

значения будут меняться

Значения не меняются, поскольку вы не спите после каждого обновления модели. Я немного изменил код:

// Thread.sleep(100);

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