【问题标题】:Updating Cell Value (JTable)更新单元格值 (JTable)
【发布时间】:2012-09-24 00:46:42
【问题描述】:

我在更新 JTable 的单元格值时遇到问题。我想要做的是在从 JTable 中选择特定单元格之后,我应该能够进行编辑,并且该操作必须反映后端的数据库。我正在使用 HSQL。我的表有 4 列,一个 PK。 请给我一个替代方案和/或通过替换 * 为我提供一些代码。我是新手。

d_view.addActionListener(new ActionListener() { //----action listener of a button
    public void actionPerformed(ActionEvent po) {
        try {
            Connection connec;
            Class.forName("org.hsqldb.jdbcDriver");
            connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
            java.sql.Statement stt=connec.createStatement();
            ResultSet rs=stt.executeQuery("select * from DepReg");//----------TO VIEW DATA IN TABULAR FORMAT
            ResultSetMetaData rt=rs.getMetaData();
            int cols=rt.getColumnCount();
            String c[] =new String[cols];
            for(int i=0;i<cols;i++){
                c[i]=rt.getColumnName(i+1);
                dm.addColumn(c[i]);
            }
              Object row[]=new Object[cols];
                while(rs.next()){
                     for(int i=0;i<cols;i++){
                            row[i]=rs.getString(i+1);
                        }
                    dm.addRow(row);
                }
                table.setModel(dm);
                connec.close();
            }
        catch (Exception ty) {}
    }
});//--------HERE THE PROBLEM STARTS
table.getModel().addTableModelListener(new TableModelListener() {
    public void tableChanged(TableModelEvent tme) {
        int rows=tme.getFirstRow();
        int colms=tme.getColumn();
        TableModel model=(TableModel)tme.getSource();
        String colname=model.getColumnName(colms);
        Object data=model.getValueAt(rows, colms);
//*********EDIT/REPLACE THE CODE ***************//
        try {
            Connection connec;
            Class.forName("org.hsqldb.jdbcDriver");
            connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
            java.sql.Statement stt=connec.createStatement();
//-----------I WILL INCLUDE AN UPDATE STATEMENT OVER HERE BASED ON THE VALUE SELECTED
        }
        catch (Exception ae) {}
        }
});

【问题讨论】:

    标签: java swing jtable actionlistener


    【解决方案1】:
    • 数据库连接不应发生在事件调度线程上。他们太慢了。将其移至后台线程。请参阅Swing concurrency tutorial 了解更多信息
    • 我不完全清楚你是否已经能够编辑你的表格,但如果没有,这是通过确保在 TableModelisCellEditable 方法为你想要的单元格返回 true 来实现的可编辑,并且您已在 JTable 上设置了 TableCellEditor
    • 我不会添加TableModelListener 来更新您的数据库,而是将该逻辑移至自定义TableModel。每次调用setValueAt 方法时,您就知道已经进行了更改。然后您可以更新数据库(同样,不是在事件调度线程上)。
    • 如果数据库也可以从其他地方更新,您可能需要在特定时刻轮询数据库以更新您的TableModel 以反映数据库的最新状态。确保在工作线程上进行轮询。然后您可以在工作线程上创建一个全新的TableModel,并在事件调度线程上替换表的TableModel。或者您可以更新 EDT 上的现有模型(不要忘记触发事件,或者如果您的模型从 DefaultTableModel/AbstractTableModel 扩展,您可以使用可用的 API)。

    我还建议阅读Swing table tutorial 了解更多信息。

    【讨论】:

    • 是的,我可以编辑单元格并选择整行...另外,是否有其他方法可以获取数据库的最新状态?喜欢使用计时器(几秒钟后会检查和/或更新 JTable)??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多