【问题标题】:How to remove a single row from JTable如何从 JTable 中删除单行
【发布时间】:2011-12-22 14:47:05
【问题描述】:

我有一个表,其中包含每一行的删除按钮。 我用

int row =  table.getEditingRow(); //To fetch the current row to delete.

然后我用

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.removeRow(row);

当我首先删除第一行和中间的任何内容时,这会删除 JTable 中的一行,但是如果我删除最后一行,它仍然会删除最后一行,但是如果有 3 个项目,下一个要删除的项目会出错在表中

Item1
Item2
Item3

当我删除第 3 项时

Item1
Item2

当我删除第 1 项或第 2 项后会导致错误

java.lang.ArrayIndexOutOfBoundsException: 2 >= 2

当我删除第 1 项,然后第 2 项,然后第 3 项或第 2 项,然后第 1 项,然后第 3 项时没有问题

这就是我构建 CellEditor 的方式

public class JButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener{
JTable table;
JButton button = new JButton();

public JButtonEditor(JTable table){
    this.table = table;
    button.addActionListener(this);
}

@Override
public Object getCellEditorValue() {
    return button.getText();
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    button.setText(value.toString());
    return button;
}

@Override
public void actionPerformed(ActionEvent e) {
    int row = table.getEditingRow();
    int column = table.getEditingColumn();
    switch(column){
        case 3:
            manage(groupId); break;
        case 4:
            editGroup(groupId); break;
        case 5:
            deleteGroup(groupId,row); break;
    }
}

private void deleteGroup(int groupId,int row) {
    //do something here to remove the group from the database
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.removeRow(row);
}

我认为在我删除 Item3 之后,当我接下来删除 Item1 或 Item2 时,它认为我仍在删除 Item3,并且由于 Item3 在 tablemodel 中消失了,它会导致 ArrayOutOfBounds 错误?

我的问题已经解决了。

public void actionPerformed(ActionEvent e) {
    int row = table.getEditingRow();
    int column = table.getEditingColumn();
    fireEditingStopped(); //added this
    switch(column){
        case 3:
            manage(groupId); break;
        case 4:
            editGroup(groupId); break;
        case 5:
            deleteGroup(groupId,row); break;
    }
}

这是我唯一改变的东西,我仍在使用我的 Cell Renderer,它现在可以工作了!

【问题讨论】:

  • 也许 deleteRow(3) 被调用了两次?请在您调用该方法的位置发布代码。
  • 为了让我们确切地看到您做错了什么,请出示您的代码,最好是sscce
  • 检查您的 row 变量。我怀疑你没有正确使用它

标签: java swing jtable


【解决方案1】:

Table Button Column 展示了我是如何做到这一点的。

【讨论】:

  • 谢谢!我忘了添加这个fireEditingStopped
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2014-10-09
  • 2017-09-28
相关资源
最近更新 更多