Java 如何更新多行列的表模型?

Java 如何更新多行列的表模型?,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我在tablemodel中有3行。每行包含9列(o-8)。我想更新每行的最后一列…但现在我只能更新第1行最后一列..请帮助` ` SAVE=new JButton("SAVE"); SAVE.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { String Status=

我在tablemodel中有3行。每行包含9列(o-8)。我想更新每行的最后一列…但现在我只能更新第1行最后一列..请帮助`

   ` SAVE=new JButton("SAVE");
     SAVE.addActionListener(new java.awt.event.ActionListener() {  
      public void actionPerformed(java.awt.event.ActionEvent e) {  
      String Status=null ;
      DbUtility ViewAbsenties=new DbUtility();
      ViewAbsenties. loadDriver();
      ViewAbsenties.connect();
      TableModel tm;
      tm = table3.getModel();
      int i = table3.getRowCount();
      System.out.println("row count"+i);

          try{
            while(i!=0){
              Status   =(String) tm.getValueAt(0,8);
              String Employeeid = (String) tm.getValueAt(i,0);
              System.out.println("Status: " + Status);
              System.out.println("Employeeid: " + Employeeid);
              ViewAbsenties.executeUpdateQuery2(Status,Employeeid);
              System.out.println("i"+i);
               i=i-1;

                  }}
            catch (Exception e5) {

                }
          });   
你应该使用

Status   =(String) tm.getValueAt(i,8);
String Employeeid = (String) tm.getValueAt(i,0);
而不是

Status   =(String) tm.getValueAt(0,8);
String Employeeid = (String) tm.getValueAt(0,0);

getValueAt中的第一个参数是rowIndex,您应该传递要更新的行的索引,但只更新循环中的第0行。

我决定总结我在上述注释中提到的观察结果

你的代码有几个问题

  • 在相同的循环周期中,您调用
    i++
    i=i-1
    ,这使得循环的变量是不变的,因此您的循环是无止境的(您已经解决了这个问题)
  • 您仍在调用
    tm.getValueAt(0,8)
    。第一个参数是
    行索引
    ,第二个参数是
    列索引
    。因此,对于每个迭代,您仍然使用第一行,而不是当前行
  • Java通常将模型和数组从
    0
    索引到
    length-1
    ,但您需要从
    length
    迭代到
    1
    。因此,您需要将变量
    i
    降低
    1
有固定代码:

int i = table3.getRowCount() - 1;
while( i >= 0 ){

          Status = (String) tm.getValueAt( i, 8 );
          String Employeeid = (String) tm.getValueAt( i, 0 );

          System.out.println( "Status: " + Status );
          System.out.println( "Employeeid: " + Employeeid );

          ViewAbsenties.executeUpdateQuery2( Status, Employeeid );

          System.out.println( "i" + i );
          i = i - 1;
}
注意: 总之,我有几点意见可以改进您的代码风格:

  • 上面的例子是循环的确切用例
  • 基于Java约定,变量名应以非大写字母开头

    for ( int i = 0; i < table3.getRowCount(); ++i ) {
          status = (String) tm.getValueAt( i, 8 );
          String employeeid = (String) tm.getValueAt( i, 0 );
    
          System.out.println( "Status: " + status );
          System.out.println( "Employeeid: " + employeeid );
    
          ViewAbsenties.executeUpdateQuery2( status, employeeid );
    
          System.out.println( "i" + i );
    }
    
    for(int i=0;i

它起作用了吗?因为在我看来,在一个循环周期中,你有
i++
i=i-1
,这使得
i
变量在循环条件下保持不变。它看起来像一个无限循环。我想你的问题的解决方案就在于此,所以删除
I++
语句,将
tm.getValueAt(0,0)
修改为
tm.getValueAt(I,0)
,你应该会没事的;我尝试了这个,但是现在没有得到任何结果。在循环的第一行仍然有
tm.getValueAt(0,8)
。我猜您希望独立地处理每个表行。我还注意到您初始化了
inti=table3.getRowCount()tm.getValueAt(i,0)
时。我不知道这是怎么回事,但在Java中,数组、模型等通常是从
0
length-1
,但您是从
1
length
调用它们的。因此,我建议您进行以下修复:
inti=table3.getRowCount()-1
而(i>=0)
。顺便说一句,我认为这是
for
循环而不是
while
的好用例。它将更易于阅读,以便更快地获得更好的帮助。硬编码表数据。您不应该有空的
catch(异常e)
块。始终打印stacktrace、写入日志消息或其他内容,但永远不要使用空的catch块。当事情出错时,这只会使调试变得更加困难。