我有一个简单的JFrame
和一个JTable
框架。用户可以将数据提供到表的行中。要求之一是关闭框架后可以保存或丢弃新数据。我认为完成此行为的最简单方法如下:
覆盖
setVisible()
框架的方法并克隆DefaultTableModel
的数据向量。将 a 添加
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);
}
事实上,奇怪的事情正在发生。克隆数据向量后,无法呈现表,这导致以下异常:
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 在 java.util.Vector.elementAt(Vector.java:470) 在 javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:650) 在 asc.model.CustomTableModel.getValueAt(CustomTableModel.java:74) 在 javax.swing.JTable.getValueAt(JTable.java:2720)
该表与该表没有originalModel
任何关系。这对我来说是一个惊喜,因为理论上,克隆不应该影响表的模型。originalModel 的目的是保存对新创建的表模型副本的引用。在我注释掉 的创建后originalModel
,一切正常。
String
另一个有趣的事情是,当我向向量添加一个空时headerNames
,表格渲染器会抛出几乎相同的ArrayIndexOutOfBounds
异常,但以这个结尾:
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
在这种情况下,第一行的第一列完美呈现。
MyCustomTableModel
是从 扩展而来的DefaultTableModel
,它没有使用任何特殊的方法。构造函数只是将数据向量和标头向量传递给超类。
我希望有人可以帮助解决问题。提前致谢。