TableListener java

TableListener java,java,swing,jtable,Java,Swing,Jtable,我的表格有3个操作1)添加2)删除3)更新状态 其中1和2是Jbuttonsl 单击1)添加时,将添加新行 单击2)删除时,将添加行 1和2)按照我的设置工作,但为了更新最后一列中的状态,我以这种方式编码 public void statusUpd() throws SQLException { table.getModel().addTableModelListener(new TableModelListener() { @Overri

我的表格有3个操作1)添加2)删除3)更新状态

其中1和2是Jbuttonsl

单击1)添加时,将添加新行

单击2)删除时,将添加行

1和2)按照我的设置工作,但为了更新最后一列中的状态,我以这种方式编码

public void statusUpd() throws SQLException
{
        table.getModel().addTableModelListener(new TableModelListener()
        {
            @Override
            public void tableChanged(TableModelEvent tme) 
            {
                int row = table.getSelectedRow();
                if(!(row<0))
                {
                    String name=(String)(table.getModel().getValueAt(row, 0));
                    String status = (String)(table.getModel().getValueAt(row, 3));
                    String update = "UPDATE "+deptName+ " SET Status = ? WHERE Name = ?";
                    try 
                    {
                        conn = ac.getConnection();
                        stmt = conn.prepareStatement(update);

                        stmt.setString(1, status);
                        stmt.setString(2, name);
                        stmt.executeUpdate();
                    } 
                    catch (SQLException | ClassNotFoundException ex)
                    {
                        ex.printStackTrace();                            
                    }
                    finally
                    {
                        try
                        {               
                            if(stmt != null){stmt.close();}
                            if(conn != null) {conn.close();}
                        }
                        catch(SQLException e){}
                     }
                }
            }
        });


}
public void statusUpd()引发SQLException
{
table.getModel().addTableModelListener(新的TableModelListener())
{
@凌驾
公共作废表已更改(TableModelEvent tme)
{
int row=table.getSelectedRow();

if(!(row可能不是最好的方法,但是您可以添加一个类变量来指示您刚刚单击了一个按钮

boolean buttonClicked = false;
单击“添加”或“删除”时,将其设置为true,然后将其置于更新代码的开头:

if(buttonClicked){
  buttonClicked = false;
  return;
}

tablemodeleevent
有一个方法,您可以使用该方法查找操作类型。因此,您可以在
tableChanged
方法开头的代码中包含:

if(tme.getType() != TableModelEvent.INSERT
        && tme.getType() != TableModelEvent.DELETE)
{
    //do stuff
}
或同等地

if(tme.getType() != TableModelEvent.UPDATE)
{
    //do stuff
}

为了更快地获得更好的帮助,请发布一篇文章。无论你做什么,都不要更改ModelListener中的模型。基本设计是错误的,你的解决方案更是错误的。建议使用
静态
是最糟糕的。@GuillaumePolet-你能解释一下为什么这是错误的吗?我以前没有使用过JTable,但我在我的工作中使用过这种类型的解决方案拥有没有问题的代码。我给出这个答案的前提是所有相关的代码都位于同一个类中。最初的问题是
TableModelListener
不是将各种模型同步在一起的好方法。有两种很好的方法可以做到这一点:1)在自定义
TableModel
2)创建一个真正的“Model”并制作一个
表格Model
,它是该“Model”上的适配器".无论选择哪一个,你建议的丑陋的破解都不必做。使用
静态
变量是很多人倾向于使用的一个非常坏的习惯。@GuillaumePolet-你是对的,我绝对不应该使用静态的。这是我养成的习惯,因为我的大多数类只有一个实例,并且从ma运行在方法中。也就是说,我不认为我的解决方案在移除静态时是错误的。它可能有点难看,使用TableModel功能(我没有使用过)可能会有更好的答案,但如果事情正确同步,应该不会引起问题。