为什么我的for循环只返回JTable中的第一个值?

时间:2016-03-03 10:41:30

标签: java swing if-statement for-loop jtable

所以我使用for循环来浏览第一列中保存的值。如果用户输入的值等于String hold中保存的值,则if语句将删除该行。我可以删除第一行但不能删除之后的任何行。我做错了什么?

Screenshot

 private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                          
   //adds a row to table
        String name = JOptionPane.showInputDialog("Enter");
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        model.addRow(new Object[]{name, "JohnSMith@example.com", "03-16/05-17"});

}                                         

private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    // deletes row from table
    String dName = JOptionPane.showInputDialog("Enter");
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();

   int rows = jTable1.getRowCount();

   for(int i = 0; i <= rows;i++){
        String hold = jTable1.getValueAt(i, 0).toString();
        if(hold.equals(dName)){
            model.removeRow(i);
        }
        break;

   }
}                

1 个答案:

答案 0 :(得分:1)

代码中的问题:

  1. 你的for循环中有一个break;,可能放错地方了。您是否打算成为if(hold.equals(name)){}区块的一部分?

  2. 您正在使用视图索引模型中删除行。 JTable.getRowCount返回视图中的行数,而不是模型。由于过滤,视图中的行数可能与模型中的行数不同。

    然后使用索引迭代行,在视图中查找值,然后从模型中删除。当您在JTable中进行排序时,这将失败。

    您需要使用JTable.convertRowIndexToViewJTable.convertRowIndexToModel将视图索引转换为模型索引,反之亦然。

    列的相同交易,用户可以通过将列拖动到不同的位置来重新排列列。对jTable1.getValueAt(i, 0)的调用将为您提供视图中第一列中的值,而不是模型。查看JTable.convertColumnIndexToViewJTable.convertColumnIndexToModel

  3. 删除这些行时,模型中的行数当然会发生变化,因此使用i<rows进行检查会导致数组超出索引异常。

  4. 删除匹配行的两种替代方法(按照我的偏好顺序):

    1. 使用for(int i=0;i!=model.getRowCount();++i)循环模型。使用model.getValueAt()查找值。删除带model.removeRow()的行,然后递减循环变量(例如model.removeRow(i--);)。

    2. 迭代模型dataVector以查找要删除的行,并使用Iterator.remove删除它们。完成循环后,请在模型上调用fireTableChanged