窗口关闭时未调用 Java Swing JTable TableModel setValueAt()

标签 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() 函数吗?

最佳答案

我不确定 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();
    }
});

关于窗口关闭时未调用 Java Swing JTable TableModel setValueAt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28139683/

相关文章:

java - Glassfish 上支持 OSGi 的 Web 应用程序中的 Servlet 过滤器

java - JDialog 处理另一个窗口

java - 在 JTextPane 中读取文件时丢失行

eclipse - 访问 JFrame 时 JVM 以退出代码 1 终止

java - 将数据插入 JTable?

java - 动态添加数据到MyTableModel

java - contains() 匹配两个字符串的问题

java - 正则表达式查找不完整的 Java 断言

java - 查找 ArrayList 的大小,其中列表名称作为字符串传递

java - 如何清除 jTable 的内容?