【发布时间】:2011-02-14 16:19:11
【问题描述】:
当加载带有小程序的页面时,JTable 对象的内容被完美呈现。当我关闭一个选项卡并重新打开它时,会呈现在开始时设置的内容,但是当我通过 setValeAt() 更改的内容时,表变为空。当我从数据模型中删除所有 html 标签时,一切正常。我对表的默认渲染器只执行数据模型什么都不做。所有值都是通过setValeAt() 设置的,它可以工作(我检查过)。
有人可以知道可能出了什么问题吗?
这里是重现错误的示例代码。运行小程序(值将发生变化),然后关闭选项卡(不是浏览器)并重新打开它。我在 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();
}
}
编辑:
index.html内的HTML小程序代码
编译代码:
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
【问题讨论】: