有一个defaulttablemodel的JTable 通过addMouseListener  new MouseAdapter()    public void mouseClicked(MouseEvent e) 得到某单元格改变前的值a1addTableModelListener  tableValueChanged(TableModelEvent evt) 可以得到某单元格改变后的值a2如果a2的值是非法的修改,就把该单元格的值恢复为a1怎么实现撒

解决方案 »

  1.   

    哪里有这么玩的。
    你这样相当于修改了model的值两次,可是实际上,应该是在修改model的值之前去判断,如果非法,根本就不允许向model插入。这个通常可以通过编辑器的stopCellEditing方法来判断,如果返回值为false则表示不允许结束编辑;为true则允许结束编辑。
    即使在editor里面你觉得不方便,也应该在setValueAt方法里面屏蔽一下非法值,至少这个方法,你可以得到旧的value以及要修改的value。这两种方法你可以选择,但是要在modellistener里面去处理,就晚了,model已经变了,如果你没有对旧值的备份,是跟本取不到的。但是,基本上没有人会浪费空间做这个,如果数据量较大,浪费的空间也就太多了。
      

  2.   

    修改单元格中的值是调用的setValueAt()方法。在调用这个方法前保存一下原来单元格的值,用getValueAt()方法,判断值合不合法,合法就用新值调setValueAt(),不合法就用保存的原来的值调setValueAt()。
    我的代码是,如果点击的是对话框的确定按钮则改变单元格的值,否则单元格中原来的值不改变。代码如下:
    if(title.equals("drops") ){
    DropItemDialog dialg =  DropItemDialog.getInstance();
    value = (String) tableModel.getValueAt(rowIndex, colIndex);
    if(dialg.getCheckedFlag()){
    //单击了确定按钮则将选中的数据写入表格
    tableModel.setValueAt(dialg.getSelectedItem(), rowIndex, colIndex);
    dialg.dispose();
    }else{
    //单击了取消按钮或者直接关闭对话框,则将单元格中原来的值写入
    tableModel.setValueAt(value, rowIndex, colIndex);
    dialg.dispose();
    }
    table.repaint();