2011-02-14 2 views
0

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

Вот пример кода, который воспроизводит ошибку. Запустите апплет (значения будут меняться), а затем закройте вкладку (НЕ браузер) и снова откройте ее. Я тестировал его в 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">
</applet>

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

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

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

EDIT 2
ЭТО JVM BUG! см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6995386 и другие. Это влияет только на JRE 1.6.0_22

ответ

1

Я не мог воспроизвести проблему, используя 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); 
} 
+0

Вы правы, моя ошибка. Вы подтверждаете это странное поведение? – BeginEnd

Смежные вопросы