2011-02-14 142 views
0

當加載了applet的頁面時,JTable對象的內容完美呈現。當我關閉一個標籤並重新打開它在內容中設置的內容時,但是當我通過setValeAt()表更改的內容變空時。當我從數據模型中刪除所有html標籤時,一切正常。我沒有做任何與表的默認渲染器只實現數據模型。所有的值都通過setValeAt()設置,它的工作原理(我檢查了它)。 有人可以知道什麼可能是錯的?JTable不渲染

這裏是示例代碼重現錯誤。運行applet(值將會更改),然後關閉選項卡(不是瀏覽器)並重新打開它。我在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(); 
    } 
} 

編輯:

HTML applet代碼裏面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

第一次運行確定。新建選項卡,然後關閉小程序選項卡。重新打開小程序選項卡(不要關閉瀏覽器)並且不會呈現表格內容。

EDIT 2
它是一個JVM BUG!見http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6995386和其他相關。它隻影響JRE 1.6.0_22

回答

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); 
} 
+0

你說得對,我的錯。你確認這種奇怪的行爲? – BeginEnd 2011-02-14 21:18:03