我的jTable共有6列,分别是单选框(直接用的new Boolean(false)生成的),a(int型),b(double型),c(double型),d(date型),e(int型),括号内的是它们的class类型,我想当前面的单选框勾选中时,将3,4,5,6列作为另一个表格的行向量(rowVector),可是总是会出现一些异常~求大大们帮忙,部分代码如下:
if (jTable.isEditing())
     if (!jTable.getCellEditor().stopCellEditing())
     return;     for (int i = 0; i < model.getRowCount(); i++)
{
   if (model.getValueAt(i, 0).equals(new Boolean(true)))
{
                sendRows = (Vector)rows.elementAt(i);
       rowVector.addElement(sendRows);
                   }
}
}这样rowVector可以把选中的整行值取出,但我现在只要后4列,要怎么改?
我在sendRows = (Vector)rows.elementAt(i);下加了
for (int j = 0; j < 2; j++)
   {
       sendRows.remove(0);
    }
但是会报ArrayIndexOutOfBoundsException:4>=4和
illegalArgumentException:cannot format given Object as a Number.
我还试了下如果只删除掉第一个的,直接sendRows.remove(0);
但是会报ArrayIndexOutOfBoundsException:5>=5和
ClassCastException:java.lang.Integer.
快郁闷死了,不知道怎么改,也不清楚为什么?
实在不行我就只能对表格进行操作了,先把取整行值的表格建起来,再把不要的列删除掉,不过还没试过不知道又会不会有问题~~~

解决方案 »

  1.   

    我汗,果然是~郁闷啊,弄了一早上,万分感激中~~
    再问下,我如果想再后来建成的表格的第一列加个f,先用sendmodel.addColumn("f");再用table.remove(4,0)建成的表格只是在view上改变了,是不是要加convertColumnIndexToModel()方法,要怎么写?
      

  2.   

    ~~当然啊~~你不是只更改了表格吗?呵呵。
    通常,做法是这样,首先建立好数据的结构,然后通知视图数据就绪,刷新显示。
    你的model操作的应该是一个二维的链表。这个链表存储的是你显示时候用到的数据。所以,你要更改这个二维链表的结构或者数据,然后再去通知表格数据已经更改。通常你不需要告诉table去干掉一列或者一行,只要告诉它model的数据改变了。如果结构发生变化,比如列数更改,那么给这个table重新调用setModel或者fireTableStructureChanged。若是仅数据改变,可以fireTableDataChanged。如果你还知道究竟是哪行改变了,可fireTableRowsUpdated(int firstRow, int lastRow)等等等等。去看一下api文档,defaultTableModel里面。这些方法都是有用的。
    不知道我说的你是否能够看明白?
      

  3.   

    看明白了,不过不会改,帮我简单写下吧。
    DefaultTableModel sendmodel = new DefaultTableModel(send_row,send_col);
    JTable sendTable = new JTable(sendmodel);
    sendmodel.addColumn("f");
    sendTable.moveColumn(4, 0);我知道接下来要通知table,怎么写?我写了:
    for (int i = 0; i < 4; i++)
    {
          sendTable.convertColumnIndexToModel(i);
    }
    可是通过sendmodel.getValueAt(1,2)取出来的值和原来的一样,那说明model并没有更新啊,另外fireTableStructureChanged()不知道怎么写.
    另外想问下,我如果是通过sendTable.getValueAt(1,2)的话,取出来的值就已经改变,是不是这样取是取视图上的数据,那我具体取值时只要通过sendTable.getValueAt()不就能取到视图上该位置的值么?那就不需要模型更新了?好像有点乱,不知道我这样问你看得明白么?
      

  4.   

    要实现界面上更改同时内存中的数据也更改,需要改写model的setValueAt方法。这个方法和setValueAt相对应。
    这样,你能不能把你的代码完整一些的给出?我就不自己全部重写了,直接修改你的。要连接数据库的话……我可能就没办法运行了,我机器上的数据库不能随便动。
      

  5.   

    我这代码也很乱,因为是连接数据库的,不过现在数据都读出来正常了,只是想在第一列前增加一列id给用户输入,简单说就是一个4列的表格想在最前面加一列变成5列的表格。
    建表是用DefaultTableModel()方法的,行向量send_row,列向量是send_col,我并没有对DefaultTableModel里的那些方法进行描述,像 getColumnCount,getColumnClass,getValueAt,setValueAt之类的,建表处的代码就是4楼所写的,很简单的,所以我现在是不是得把DefaultTableModel里的这些方法都写一遍,然后改写getValueAt()(setValueAt()呢?),如果是的话,你就简单帮我写下这里面的写法吧?谢谢~
      

  6.   

    另外,我看后多用fireXXX的都是用Abstract模型的,Default也能用么?
      

  7.   

    没错。DefaultTableModel继承自AbstractTableModel,所以能够使用这些方法。我知道你所使用的方法了。你用的那个构造函数
    DefaultTableModel sendmodel = new DefaultTableModel(send_row,send_col); 
    send_row是你的数据,send_col是列名列表。若你仅仅是想要增加一个列做显示倒是简单。send_row一定是一个二维结构。数组,链表,向量等等,而每个对象又是一个相同的结构。假设我称为record。for(Iterator it = rowVector.iterator(); it.hasNext();){
          Vector v = (Vector)it.next();
          
          Vector record = new vector();
          record.add(String.valueOf(i + 1));
          ……//这里向record里面加你想要的其他东西
           
          send_row.add(record);
    }
    //
    DefaultTableModel sendmodel = new DefaultTableModel(send_row,send_col); 
    不过还是仔细研究一下那些方法比较好。即时你没有显示地改写那些方法,但是实际的操作流程和你改写是没有任何区别的。这些去百度一下,或者google一下,很多,有些说的很明白,其实本身也不复杂~~~
    今天我就不罗嗦了~~呵呵,饿死了,下班了,吃饭去。
      

  8.   

    好,谢谢了,一开始也有想过直接在vector里面改,后来想多熟悉下jTable,就想在jTable里面搞,刚把convertColumnIndexToModel()搞清楚了,一开始没注意看,原来返回的都是索引值,所以原来的model.getValueAt(1,2)列改变后直接用model.getValueAt(1,convertColumnIndexToModel(2));就能取到视图改变后的值了,不过这个貌似也不是更新,所以还在研究fireXXX中,希望你有空发封私信再教教我,关于fireXXX这类的~~