Java Jtable-编辑后获取表格单元格数据

Java Jtable-编辑后获取表格单元格数据,java,swing,jtable,Java,Swing,Jtable,我有一个包含数据库数据的JTable。我可以使用 table.getValueAt(table.getSelectedRow(),3) 我不知道的是,在运行应用程序中编辑后如何获取同一单元格的新数据。我尝试运行updatesql命令来推送新数据,但它没有更新。我想我错过了一步。我也尝试过TableModelListener,但我几乎没有运气让它按我需要的方式工作。这是我迄今为止为协助检索和更新数据所做的工作: private void UpdateDbFromJTable(){

我有一个包含数据库数据的JTable。我可以使用

table.getValueAt(table.getSelectedRow(),3)    
我不知道的是,在运行应用程序中编辑后如何获取同一单元格的新数据。我尝试运行updatesql命令来推送新数据,但它没有更新。我想我错过了一步。我也尝试过TableModelListener,但我几乎没有运气让它按我需要的方式工作。这是我迄今为止为协助检索和更新数据所做的工作:

private void UpdateDbFromJTable(){
    table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
        @Override
        public void valueChanged(ListSelectionEvent event) {
            if (table.getSelectedRow() > -1) {
                // print first column value from selected row
             String App = table.getValueAt(table.getSelectedRow(),0).toString();
             String Version = table.getValueAt(table.getSelectedRow(),1).toString();
             String Issue = table.getValueAt(table.getSelectedRow(),2).toString();
             String Resolved =table.getValueAt(table.getSelectedRow(),3).toString();


            try {
                String sql = "UPDATE Bugs SET Resolved =" + Resolved + "WHERE App = \" " + App + "' AND Version =\"" + Version + "\" AND Issue = \"" + Issue + "\"";
                conn = DriverManager.getConnection(DB_URL);
                stmt = conn.prepareStatement(sql);
                rs = stmt.executeUpdate();


            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);

            }
             }

        }

    });


}
Update语句此时不正确,因为它只是将“已解析”更新为数据库中已设置的值

这就是现在发生的事情,我已经更正了更新。在对不同的表条目进行更改后,每次单击“保存”,我都会得到重复的“println”(s): 私有void UpdateDbFromJTable(){

我的保存按钮:

btnSave.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            UpdateDbFromJTable();
            JTable();

        }
    });
还有我的JTable():


您可以尝试以这种方式添加
TableModelListener
,该方法在表发生更改后执行。例如:

tableModel.addTableModelListener(new TableModelListener(){
    @Override
    public void tableChanged(TableModelEvent tableModelEvent) {
        if(table.isEditing())
        String value = table.getValueAt(table.getSelectedRow(),3);    
        //do stuff  with value          
    }
});

您可以尝试以这种方式添加
TableModelListener
,该方法在表发生更改后执行。例如:

tableModel.addTableModelListener(new TableModelListener(){
    @Override
    public void tableChanged(TableModelEvent tableModelEvent) {
        if(table.isEditing())
        String value = table.getValueAt(table.getSelectedRow(),3);    
        //do stuff  with value          
    }
});

我猜您的编辑器仍处于活动状态,因此数据尚未保存到模型中

因此,您需要停止在ActionListener中编辑:

if (table.isEditing())
     table.getCellEditor().stopCellEditing();
查看更多信息和其他方法

另外,对SQL使用
preparedstation
,这样更易于维护,也更不容易出错:

String sql = "UPDATE Page SET Title = ? WHERE Name = ?";

PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString( 1, "update" );
stmt.setString( 2, "Name3" );
stmt.executeUpdate();
stmt.close();

我猜您的编辑器仍处于活动状态,因此数据尚未保存到模型中

因此,您需要停止在ActionListener中编辑:

if (table.isEditing())
     table.getCellEditor().stopCellEditing();
查看更多信息和其他方法

另外,对SQL使用
preparedstation
,这样更易于维护,也更不容易出错:

String sql = "UPDATE Page SET Title = ? WHERE Name = ?";

PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString( 1, "update" );
stmt.setString( 2, "Name3" );
stmt.executeUpdate();
stmt.close();

由于@camickr指出它创建了多个侦听器,我终于明白了为什么它会复制。我将侦听器移动到按钮本身周围

 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent event) {

                if (!event.getValueIsAdjusting()) {
                    if (table.getSelectedRow() > -1) {
                        // print first column value from selected row
                        app = table.getValueAt(table.getSelectedRow(), 0).toString();
                        version = table.getValueAt(table.getSelectedRow(), 1).toString();
                        issue = table.getValueAt(table.getSelectedRow(), 2).toString();
                        resolved = table.getValueAt(table.getSelectedRow(), 3).toString();
                        System.out.println(app + "  " + version + "  " + issue + "  " + resolved);

                    }
                }
                btnSave.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {

                        updateDbFromJTable();
                        //jTable();
                    }
                });
            }
        });

由于@camickr指出它创建了多个侦听器,我终于明白了为什么它会复制。我将侦听器移动到按钮本身周围

 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent event) {

                if (!event.getValueIsAdjusting()) {
                    if (table.getSelectedRow() > -1) {
                        // print first column value from selected row
                        app = table.getValueAt(table.getSelectedRow(), 0).toString();
                        version = table.getValueAt(table.getSelectedRow(), 1).toString();
                        issue = table.getValueAt(table.getSelectedRow(), 2).toString();
                        resolved = table.getValueAt(table.getSelectedRow(), 3).toString();
                        System.out.println(app + "  " + version + "  " + issue + "  " + resolved);

                    }
                }
                btnSave.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {

                        updateDbFromJTable();
                        //jTable();
                    }
                });
            }
        });

好的,我更新了一次。现在在测试时,我得到了重复的
println
(s)每次我编辑表中的一个条目时,
println
都会以指数方式增长两倍。在创建表时,不是每次单击按钮时,都将ListSelectionListener添加到ListSelectionModel中。@camickr再次感谢这帮助我缩小了更多的范围。。但是无论我把它放在哪里,输出的数量似乎都会增加每次启动ListSelectionListener时都会轻松。我已经研究并发现我可以使用
!e.getValueIsAdjusting
,但没有解决此问题。我感谢您抽出时间来帮助解决此问题。好的,我只更新了一次。现在在测试时,我得到了重复的
println
(s)每次我编辑表中的一个条目时,
println
都会以指数方式增长两倍。在创建表时,不是每次单击按钮时,都将ListSelectionListener添加到ListSelectionModel中。@camickr再次感谢这帮助我缩小了更多的范围。。但是无论我把它放在哪里,输出的数量似乎都会增加每次启动ListSelectionListener时都会变得轻松。我已经研究并发现我可以使用
!e.getValueIsAdjusting
,但没有解决问题。我感谢您抽出时间来帮助解决此问题。谢谢!这确实有效。我还需要处理一些错误,我更新了现在正在发生的事情。我知道您的代码非常有用ked我可以保存一个条目而没有错误。但是出现了一个新问题Hanks!这确实有效。我还有一些bug需要解决,我更新了现在正在发生的事情。我知道你的代码工作正常,我可以保存一个条目而没有错误。但是出现了一个新问题