Java 更新单元格值(JTable)

Java 更新单元格值(JTable),java,swing,jtable,actionlistener,Java,Swing,Jtable,Actionlistener,我在更新JTable的单元格值时遇到问题。我想做的是,在从JTable中选择一个特定的单元格之后,我应该能够进行编辑,并且操作必须反映后端的数据库。我正在使用HSQL。我的表有4列和一个主键。 请给我一个替代方案和/或通过替换*s为我提供一些代码。我是新手,只是个初学者 d_view.addActionListener(new ActionListener() { //----action listener of a button public void actionPerformed(

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

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) {}
        }
});
d_view.addActionListener(新建ActionListener(){/----按钮的操作侦听器
已执行的公共无效操作(操作事件po){
试一试{
连接连接器;
Class.forName(“org.hsqldb.jdbcDriver”);
connec=DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost/","SA","SA",;
java.sql.Statement stt=connec.createStatement();
ResultSet rs=stt.executeQuery(“从DepReg中选择*);/------------以表格格式查看数据
ResultSetMetaData rt=rs.getMetaData();
int cols=rt.getColumnCount();
字符串c[]=新字符串[cols];
对于(int i=0;i
  • 数据库连接不应发生在事件调度线程上。它们太慢。请将其移动到后台线程。有关详细信息,请参阅
  • 我不完全清楚您是否已经能够编辑表格,但如果没有,则可以通过在
    TableModel
    中确保
    isCellEditable
    方法为您想要编辑的单元格返回
    true
    ,并且您已经在
    JTable
    上设置了
    TableCellEditor
    来实现>
  • 与添加
    TableModelListener
    来更新数据库不同,我会将该逻辑移动到自定义
    TableModel
    。每次调用
    setValueAt
    方法时,您都知道已经进行了更改。然后您可以更新数据库(同样,不是在事件调度线程上)
  • 如果还可以从其他位置更新数据库,则可能需要在特定时间轮询数据库,以更新
    TableModel
    ,以反映数据库的最新状态。请确保在工作线程上进行轮询。然后,您可以在工作线程上创建全新的
    TableModel
    ,并替换事件调度线程上表的
    TableModel
    。或者您可以在EDT上更新现有模型(不要忘记触发事件,或者如果您的模型从
    DefaultTableModel
    /
    AbstractTableModel
    扩展,则可以使用可用的API)

我还建议阅读以了解更多信息。

是的,我可以编辑单元格并选择整行……此外,是否有其他方法获取数据库的最新状态?例如使用计时器(几秒钟后将检查和/或更新JTable)??