Java JTable在列表中获取错误的值

Java JTable在列表中获取错误的值,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我有一张桌子 id member_id amount 20 1 120 19 1 5400 18 2 580 17 3 620 16 2 250 当右键单击一行并单击弹出菜单项时,它会正确地删除JTable中要删除

我有一张桌子

    id       member_id        amount
    20       1                120
    19       1                5400
    18       2                580
    17       3                620
    16       2                250
当右键单击一行并单击弹出菜单项时,它会正确地删除JTable中要删除的行,但当我在用于填充JTable的对象列表中找到已删除的记录时,它总是选择next record(下一条记录)

例如,如果选择了id=20的行,如果我通过使用getSelectedRow在我使用的对象列表中查找对应的记录来使用JTable的索引,那么我会得到id=19的匹配对象,依此类推。选择id=16时,控制台中将显示“AWT-EventQueue-0”java.lang.IndexOutOfBoundsException

我使用AbstractTableModel实现来操作JTable和一个列表,以获取并填充表中的所有数据

我的代码

    private List<AdvancePayment> payments = memberHandler.getAdvancePaidMembers();      
负责删除列表中的记录

    public void deleteRow(int index) {
          advanceList.remove(index);

          System.out.println("Row index: "+index);
          fireTableRowsDeleted(index, index);
     }        
我不明白为什么删除的索引与我用来填充数据库的同一列表中的正确记录不匹配。请协助。如果您需要更多代码,请尽管询问

我的AbstractTableModel实现

    package TableModels;

    import java.util.List;
    import javax.swing.table.AbstractTableModel;
    import models.AdvancePayment;

    /**
     *
     * @author Administrator
     */
    public class AdvancePaymentTableModel extends AbstractTableModel{
        private List<AdvancePayment> advanceList;
        private String[] columnNames = {"MNO", "NAME", "MONTH", "ADVANCE       AMOUNT"};

        private final Class[] columnClass = new Class[] {
            Integer.class, String.class, String.class, Float.class
        };

        public AdvancePaymentTableModel(List<AdvancePayment> advanceList) {
            this.advanceList = advanceList;
        }

        @Override
        public String getColumnName(int column)
        {
            return columnNames[column];
        }

       @Override
       public Class<?> getColumnClass(int columnIndex)
       {
            return columnClass[columnIndex];
       }

       public void addRow(AdvancePayment rowData)
       {
            advanceList.add( 0, rowData );
            fireTableRowsInserted(advanceList.size() - 1, advanceList.size()   - 1);
       }

       public void deleteRow(int index) {
            advanceList.remove(index);

            System.out.println("Row index: "+index);
            fireTableRowsDeleted(index, index);
       }

       @Override
       public int getRowCount() {
           return advanceList.size();
       }

       @Override
       public int getColumnCount() {
            return columnNames.length;
       }

       @Override
       public Object getValueAt(int rowIndex, int columnIndex) {
             AdvancePayment row = advanceList.get(rowIndex);

            if(0 == columnIndex) {
                return row.getMNO();
            }
            else if(1 == columnIndex) {
                return row.getName();
            }
           else if(2 == columnIndex) {
                return getMonthString(row.getAdvanceMonth());
            }
          else if(3 == columnIndex) {
                return row.getAmountPaid();
           }
            return null;
        }

}

首先获取要删除的付款,然后将其从表中删除

示例实现如下所示:

private void deleteMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                               
      int row = tableAdvancePayment.getSelectedRow();
      AdvancePayment deletedPayment = payments.get(indexModel);
      model.deleteRow(row);
      //do something with deletedPayment
}  

考虑提供一个演示你的问题的代码。这不是一个代码转储,而是你正在做的一个例子,它突出了你所面临的问题。如果你调用<代码>模型。Deluto(行);,然后是代码> AdvestayPayDelayPay=付款。获取(索引模型),这将导致更少的混乱和更好的响应。…您希望它返回什么?另外请注意,在删除iti之前,您没有将
索引转换为模型索引。它使用了从tableAdvancePayment.convertRowIndexToModel(行)返回的索引;但返回的记录仍比预期的少1,例如,当选择20时,我看到19
this.advanceList=advanceList;
表示
表格模型中的
列表和您过去的列表是同一件事(它们指向相同的
列表
),您正在
列表的同一实例上进行交互,您正在尝试查找一个不再存在的条目。请尝试使用
this.advanceList=new ArrayList(advanceList);
相反,它将复制
列表
,这样,当您从
表格模型
中删除一个项目时,它不会从原始列表中删除,尽管回复延迟,至少我回复了。Life saver。
  public class AdvancePayment {
     private int member_id, advance_year, advance_month, mno;
     private long id;
     private float amount_paid;
     private String name;

     public int getMNO() {
          return mno;
     }

     public void setMNO(int mno) {
         this.mno = mno;
     }

     public int getMemberId() {
         return member_id;
     }

      public void setMemberId(int member_id) {
          this.member_id = member_id;
      }

      public int getAdvanceYear() {
          return advance_year;
      }

       public void setAdvanceYear(int advance_year) {
            this.advance_year = advance_year;
       }

       public int getAdvanceMonth() {
            return advance_month;
       }

       public void setAdvanceMonth(int advance_month) {
            this.advance_month = advance_month;
       }

       public long getId() {
           return id;
        }

        public void setId(long id) {
            this.id = id;
        }

        public float getAmountPaid() {
            return amount_paid;
        }

        public void setAmountPaid(float amount_paid) {
            this.amount_paid = amount_paid;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }
private void deleteMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                               
      int row = tableAdvancePayment.getSelectedRow();
      AdvancePayment deletedPayment = payments.get(indexModel);
      model.deleteRow(row);
      //do something with deletedPayment
}