Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DefaultTableModel数据向量的克隆问题_Java_Swing_Jtable_Clone_Defaulttablemodel - Fatal编程技术网

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) 在这种情况下,第一行的第一列渲染得非常完美

    My
    CustomTableModel
    是从
    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