所以我使用这个 for 循环来遍历第一列中保存的值。然后,如果用户输入的值等于 Stringhold 中保存的值,则 if 语句将删除该行。我可以删除第一行,但无法删除此后的任何行。我做错了什么?
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;
}
}
最佳答案
代码中的问题:
您有
break;
在你的 for 循环中,它可能放错了地方。您是否打算将其纳入if(hold.equals(name)){}
阻止?您正在使用 View 索引从模型中删除行。
JTable.getRowCount
返回 View 中的行数,而不是模型。由于过滤, View 中的行数可能与模型中的行数不同。然后,您使用索引迭代行,在 View 中查找值,然后从模型中删除。当您在 JTable 中进行排序时,这将失败。
您需要使用
JTable.convertRowIndexToView
将 View 索引转换为模型索引,反之亦然和JTable.convertRowIndexToModel
.对于列来说也是如此,用户可以通过将列拖动到不同的位置来重新排列列。调用
jTable1.getValueAt(i, 0)
将为您提供 View 第一列中的值,而不是模型。查看JTable.convertColumnIndexToView
和JTable.convertColumnIndexToModel
.当这些行被删除时,模型中的行数当然会发生变化,因此使用
i<rows
进行检查会导致数组超出索引异常。
删除匹配行的两种替代方法(按照我的偏好顺序):
使用
for(int i=0;i!=model.getRowCount();++i)
循环模型。使用model.getValueAt()
查找值。删除model.removeRow()
的行,然后递减循环变量(例如model.removeRow(i--);
)。迭代模型的
dataVector
查找要删除的行,并使用Iterator.remove
删除它们。循环结束后,调用fireTableChanged
在您的模型上。
关于java - 为什么我的 for 循环只返回 JTable 中的第一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35769859/