Java DefaultTableModel数据向量的克隆问题
我在框架上有一个简单的Java DefaultTableModel数据向量的克隆问题,java,swing,jtable,clone,defaulttablemodel,Java,Swing,Jtable,Clone,Defaulttablemodel,我在框架上有一个简单的JFrame和一个JTable。 用户可以将数据提供到表的行中。其中一个要求是,在关闭帧后,可以保存或丢弃新数据。我认为实现这种行为的最简单方法是: 覆盖帧的setVisible()方法并克隆DefaultTableModel的数据向量 在框架中添加一个WindowListener,并对WindowClosing事件做出反应。这样,窗口侦听器可以决定是否将模型重置为以前保存的模型 以下是相关的代码片段: @Override public void setVisible(bo
JFrame
和一个JTable
。
用户可以将数据提供到表的行中。其中一个要求是,在关闭帧后,可以保存或丢弃新数据。我认为实现这种行为的最简单方法是:
setVisible()
方法并克隆DefaultTableModel
的数据向量WindowListener
,并对WindowClosing
事件做出反应。这样,窗口侦听器可以决定是否将模型重置为以前保存的模型@Override
public void setVisible(boolean b) {
//save the original models only if setVisible invoked with true (do not save the model when hiding the frame)
if (b) {
Vector cloned = (Vector) userTableModel.getDataVector().clone();
Vector headerNames = new Vector();
originalModel = new CustomTableModel(cloned, headerNames);
}
super.setVisible(b);
}
事实上,有些奇怪的事情正在发生。克隆数据向量后,无法呈现该表,这导致以下异常:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:650)
at asc.model.CustomTableModel.getValueAt(CustomTableModel.java:74)
at javax.swing.JTable.getValueAt(JTable.java:2720)
在这种情况下,第一行的第一列渲染得非常完美
MyCustomTableModel
是从DefaultTableModel
扩展而来的,它不使用任何特殊方法。构造函数只是将数据向量和头向量传递给超类
我希望有人能帮助解决这个问题。
提前感谢。我认为您在
向量克隆
中有一个错误,因为您试图返回纯向量
,但基于向量
在您的情况下headerNames向量的长度必须与您拥有的列数相匹配。这是令人困惑的,因为向量被转换为CustomTableModel类中的头名称数组,这就是它显示为AIOOBE的原因
因此,第一次通过时,它在headerNames向量/数组中查找第一列(索引0处的列),并失败,发送0>=0版本的错误。添加列名字符串(尽管可能为空)后,它将成功呈现整个第一列,然后查找第二列(索引1处的列)。它失败了,因为headerNames向量中没有第二个元素,并且给出了错误的1>=1版本
确保headerNames向量具有正确数量的值(与数据向量中的列数相匹配),然后就可以开始了
注意-clone()方法正在生成数据的浅层副本,因此用户对单元格中的数据所做的更改仍将更改原始对象。本文可能会对此有所帮助:。的实现将使您能够直接控制数据结构。这说明了
映射
,但选择是任意的。要获得更好的帮助,请尽快使用编辑问题
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1