Java Swing JTable TableModel setValueAt()在窗口关闭时不会被调用

时间:2015-01-25 18:06:43

标签: java swing jtable focus tablemodel

我已经实现了一个自定义TableModel,它从数据库中获取数据,然后在编辑单元格时将数据保存到数据库中。

即:

AbstractTableModel myModel = new AbstractTableModel(){
    @Override public Object getValueAt(int r, int c){
        //get value from the database, return it
    }
    @Override public setValueAt(Object val, int r, int c){
        //update gui
        //save change in database
    }
    //other methods here....
}

JTable tbl = new JTable(myModel);

这样可以正常工作,但是为了调用setValueAt(),您需要停止编辑单元格,默认情况下,这只会在您选择其他单元格时按Enter键等。

然后我添加了一行:

tbl.putClientProperty("terminateEditOnFocusLost", true);

这意味着当我单击远离表时,调用setValueAt()并更新数据库,但是如果我编辑单元格的值,则关闭JFrame而不会使表失去焦点或单击另一个单元格setValueAt( )永远不会被调用,因此数据库不会更新,因此您对该单元格所做的任何更改都将丢失。

有没有办法防止这种情况并调用setValueAt()函数?

1 个答案:

答案 0 :(得分:3)

我不确定JTable是否可以做到这一点,但你可以处理窗口关闭事件,其中手动接受编辑单元格的新值。

frame.addWindowListener(new WindowAdapter(){
    @Override
    public void windowClosing(WindowEvent e) {
        if(table.isEditing())
            // This will dispose editor and call setValueAt() of your model as normally happens
            table.getCellEditor().stopCellEditing();
    }
});