如果某一个单元格处于编辑状态,当点击JTable以外的组件后,单元格的焦点并不会丢失!!下次你切换回来,那个单元格还持有焦点,要命的是:数据仍然是上次的!!
这应该是JTable的bug,我现在的办法是在每次切换数据以前,都加上这段代码:
TableCellEditor ce = table.getCellEditor();
        if (ce != null) {
            ce.stopCellEditing();
        }大家还有什么好的办法吗?

解决方案 »

  1.   

    咦?那些说swing超好用的高手跑哪儿去了?
      

  2.   

    这是因为在编辑状态时,TableModel里面的值不是时时更新,如果你想做到及时更新的话,可以试着监听单元格的输入,然后动态更新TableModel
      

  3.   

    int row = budgetTable.getSelectedRow();
    int col = budgetTable.getSelectedColumn(); if ((row >= 0) && (col >= 0))
    {
    if (budgetTable.isEditing())
    {
    budgetTable.getCellEditor(row, col).stopCellEditing();
    } if (budgetTable.getCellEditor(row, col).getCellEditorValue() == null)
    {
    ((BudgetTableModel) budgetTable.getModel()).setValueAt(new Integer(0), row, col);
    }
    }
      

  4.   

    这样做太麻烦了,JTable的这一点真让人恼火。
    在主从表的编辑中,用JTable做从表的情况很多,用户往往输入完从表的数据,就切换主表记录。这样JTable却把上一个从表的数据带到了下一条记录,真是恶心透了,被测试员提了很多bug...
      

  5.   

    楼主误会了,你只有打回车后,数据才会从视图更新到模型,你没有打回车,是不会更新的,这就是你说的数据仍是原来数据的原因。
    另外,当你双击选中单元格时,编辑器由JLabel变为JTextField,所以当你选中别的单元格,编辑器由JTextField变为JLabel,因此仍然有焦点,此时必须连打两次回车,数据才会从视图更新到模型,一切就正常了。
      

  6.   

    我也用的stopCellEditing();这方法,想不到比较好的,让用户按回车几次,不太现实
      

  7.   

    重写TableCellEditor,加上FocusLost监听,在里面调用Table的stopEditing方法.