Java window 关闭时未调用 Swing JTable TableModel setValueAt()
Java Swing JTable TableModel setValueAt() not called when window closed
我实现了一个自定义 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(),您需要停止编辑单元格,默认情况下,这只会在您 select 另一个单元格、按回车键等时发生。
然后我添加了行:
tbl.putClientProperty("terminateEditOnFocusLost", true);
这意味着当我点击远离 table 时调用 setValueAt() 并更新数据库,但是如果我编辑单元格的值,则关闭 JFrame 而不会 table 失去焦点或单击另一个单元格 setValueAt() 永远不会被调用,因此数据库不会更新,因此您对该单元格所做的任何更改都将丢失。
有什么方法可以防止这种情况发生并调用 setValueAt() 函数吗?
我不确定 JTable 是否可以解决问题,但您可以处理 window 关闭事件,手动接受编辑单元格的新值。
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();
}
});
我实现了一个自定义 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(),您需要停止编辑单元格,默认情况下,这只会在您 select 另一个单元格、按回车键等时发生。
然后我添加了行:
tbl.putClientProperty("terminateEditOnFocusLost", true);
这意味着当我点击远离 table 时调用 setValueAt() 并更新数据库,但是如果我编辑单元格的值,则关闭 JFrame 而不会 table 失去焦点或单击另一个单元格 setValueAt() 永远不会被调用,因此数据库不会更新,因此您对该单元格所做的任何更改都将丢失。
有什么方法可以防止这种情况发生并调用 setValueAt() 函数吗?
我不确定 JTable 是否可以解决问题,但您可以处理 window 关闭事件,手动接受编辑单元格的新值。
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();
}
});