删除最后一行Jtable时出错

时间:2016-08-21 01:37:42

标签: java swing jtable

当我尝试删除Jtble中的最后一行时,它会抛出一个OutBound错误。

这里实现了Jtable& amp; DefaultTable:

Vector<String> rowOne = new Vector<>();  
        rowOne.addElement("Harry");
        rowOne.addElement("100414");
        rowOne.addElement("21");
        rowOne.addElement("239438"); 
        rowOne.addElement("24/24/23");
        rowOne.addElement("30000");

        Vector<String> rowTwo = new Vector<>(); 
        rowTwo.addElement("Gordon");
        rowTwo.addElement("34353");
        rowTwo.addElement("25");
        rowTwo.addElement("2538"); 
        rowTwo.addElement("24/24/23");
        rowTwo.addElement("20000");

        Vector<Vector> rowData = new Vector<>();
        rowData.addElement(rowOne);
        rowData.addElement(rowTwo);

        columnNames = new Vector<>();
        columnNames.addElement("Name");
        columnNames.addElement("Cc");
        columnNames.addElement("Age");
        columnNames.addElement("Phone");
        columnNames.addElement("Date");
        columnNames.addElement("Amount");


        DefaultTableModel model = new DefaultTableModel(rowData, columnNames);
        Jtable table = new JTable(model);

此处删除代码:

else if (e.getActionCommand().equals("deleteClient"))
        {
            if(table.getSelectedRow() != -1)
            {
                DefaultTableModel tModel1 = (DefaultTableModel) table.getModel();
                int seletedRow = table.getSelectedRow();

                tModel1.removeRow(seletedRow);
            }

当删除最后一个Jtable的行时,抛出错误,当我删除不同的行作为第一行或中间行时,不会抛出任何错误,我该如何解决?

1 个答案:

答案 0 :(得分:2)

你的问题不在于行

tModel1.removeRow(seletecdRow);

int selectedRow = table.getSelectedRow();
int selectedCol = table.getSelectedColumn();
tModel1.removeRow(selectedRow);
String name = (String) tModel1.getValueAt(seletecdRow, seletecdCol); // Here

删除最后一行时,存储在selectedRow中的索引不再有效。此外,每当删除一行时,它都会被取消选中,因此,table.getSelectedRow()将返回-1(因为没有选择任何行)。

假设你有5行:

您可以从第1行到第4行(索引0到3)中选择任何行并将其删除。 selectedRow = 0,1,2 or 3并且您留下了4行,因此在索引0,1,2或3处仍然存在一行并且model.getValueAt(selectedRow...正常工作

但是如果你选择第5行(最后一行,在索引4)并删除它。 selectedRow = 4并且你剩下4行(索引0,1,2,3),但索引4上不再有一行。model.getValueAt(selectedRow...给出错误

解决方案取决于您在删除行后在标签中尝试执行的操作。

  • 如果您尝试设置标签以显示已删除行的信息:

    String name = (String) tModel1.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
    labelStatus.setText(name);
    tModel1.removeRow(table.getSelectedRow());
    
  • 如果您尝试重新选择表格中的另一行并设置标签以显示此新选择的行的信息:

    int selectedRow = table.getSelectedRow();
    tModel1.removeRow(selectedRow);
    int numRowsLeft = tModel1.getRowCount();
    if (numRowsLeft > 0) { // only reset selection if table is not empty
        if (selectedRow > numRowsLeft - 1) { // last row deleted, new selection will be new last row
            table.setRowSelectionInterval(numRowsLeft-1, numRowsLeft-1);
        } else { // deleted from the start or middle, selectedRow now points to the next row after the deleted row
            table.setRowSelectionInterval(selectedRow, selectedRow);
        }
        String name = (String) tModel1.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
        labelStatus.setText(name);
    }