所以我使用for循环来浏览第一列中保存的值。如果用户输入的值等于String hold中保存的值,则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;
}
}
答案 0 :(得分:1)
代码中的问题:
你的for循环中有一个break;
,可能放错地方了。您是否打算成为if(hold.equals(name)){}
区块的一部分?
您正在使用视图索引从模型中删除行。 JTable.getRowCount
返回视图中的行数,而不是模型。由于过滤,视图中的行数可能与模型中的行数不同。
然后使用索引迭代行,在视图中查找值,然后从模型中删除。当您在JTable中进行排序时,这将失败。
您需要使用JTable.convertRowIndexToView
和JTable.convertRowIndexToModel
将视图索引转换为模型索引,反之亦然。
列的相同交易,用户可以通过将列拖动到不同的位置来重新排列列。对jTable1.getValueAt(i, 0)
的调用将为您提供视图中第一列中的值,而不是模型。查看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
。