首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除最后一行JTable的问题

删除最后一行JTable的问题
EN

Stack Overflow用户
提问于 2010-11-25 07:18:24
回答 5查看 4.1K关注 0票数 3

这是我第一次在这里问你,如果有什么不合适的地方,请原谅我,如果我的英语不太好,很抱歉。

简而言之,目前我正在开发一个带有Swing的Java桌面应用程序,而且我在使用表时遇到了问题。我有行和每一行都有一个按钮来删除该行。一切都很好(我可以删除没有问题的行),直到我尝试删除最后一行。最后一行可以删除,但显然有一个例外,如下所示:

代码语言:javascript
复制
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
    at java.util.Vector.elementAt(Vector.java:427)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:648)
    at javax.swing.JTable.setValueAt(JTable.java:2710)
    at javax.swing.JTable.editingStopped(JTable.java:4712)
    at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125)

从堆栈跟踪来看,"4“似乎是我之前删除的最后一行索引,但我不知道如何处理。我已经在寻找解决办法了,但我还是解决不了。请注意,当我删除最后一行时,仍有其他行,之后不能删除其他行。当我单击“删除”按钮时,也会出现同样的异常。

噢。我使用removeRow()从DefaultTableModel删除该行。任何帮助都将不胜感激。谢谢。

编辑--这是我使用的代码。

代码语言:javascript
复制
public class ViewDetail extends JInternalFrame implements ActionListener {
    ...
    String column[] = { "Aaa", "Bbb", "Delete This"};

    tableModel = new DefaultTableModel();
    Object row[][] = new Object[size][column.length];

    //fill the data from db
    int r = 0;
    for (int i = 0; i < size; i++) {
    row[r][0] = ...;
    row[r][1] = ...;
    row[r][2] = "Delete";
    r++;
    }

    tableModel.setDataVector(row, column);
    table = new JTable(tableModel);

    tableColumn = table.getColumn("Aaa");
    tableColumn.setPreferredWidth(75);
    tableColumn = table.getColumn("Bbb");
    tableColumn.setPreferredWidth(75);
    tableColumn = table.getColumn("Delete This");
    tableColumn.setPreferredWidth(75);
    tableColumn.setCellRenderer(new ButtonRenderer());
    tableColumn.setCellEditor(new ButtonEditor(new JCheckBox());
     ...
}

public class ButtonRenderer extends JButton implements TableCellRenderer {
    public ButtonRenderer() {
        setOpaque(true);
    }
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(UIManager.getColor("Button.background"));
        }
        setText((value == null) ? "" : value.toString());
        return this;
    }
}

public class ButtonEditor extends DefaultCellEditor {
    protected JButton button;
    private String label;
    private boolean isPushed;
    private JTable table;
    public ButtonEditor(JCheckBox checkBox) {
    super(checkBox);
    button = new JButton();
    button.setOpaque(true);
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            fireEditingStopped();
            }
        });
    }

    public Component getTableCellEditorComponent(JTable table, Object value,
        boolean isSelected, int row, int column) {
    if (isSelected) {
        button.setForeground(table.getSelectionForeground());
        button.setBackground(table.getSelectionBackground());
    } else {
        button.setForeground(table.getForeground());
        button.setBackground(table.getBackground());
    }
    label = (value == null) ? "" : value.toString();
    button.setText(label);
    isPushed = true;
    this.table = table;
    return button;
    }

    public Object getCellEditorValue() {
    if (isPushed) {
                  DefaultTableModel tableModel = (DefaultTableModel) table.getModel();                            
                  tableModel.removeRow(table.getSelectedRow());                
            }
            isPushed = false;
    return new String(label);
    }

    public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
}

protected void fireEditingStopped() {
        super.fireEditingStopped();
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-25 13:26:14

Swing正在尝试将新值设置到您删除的行中!尝试将删除代码移到可运行的代码中,并在swing实用程序类中使用invokeLater来执行它。

票数 4
EN

Stack Overflow用户

发布于 2010-11-25 07:27:07

您可以在您的JTable中张贴您输入的代码、添加元素和删除吗?

我的第一个猜测是,当您的表在索引中从0到3时,您要么执行经典错误“我的表中有4个元素,所以要删除最后一个我删除的元素(4)”

或者您试图在同一个循环中删除几个对象,如

代码语言:javascript
复制
  for(int i = 0; i<lenght; i++){
       if(i%2==0){//every even number
         tab.remove(i);
        }
    }

然后您正在修改您的表的大小,元素被移动,但是在移除时没有考虑到它。

这些只是猜测/指向可能导致问题的原因。如果这不能解决问题,请张贴您的代码

票数 1
EN

Stack Overflow用户

发布于 2010-11-25 15:22:16

表按钮列展示了如何将列呈现为按钮,以及如何添加单击按钮时执行的操作。示例操作恰好演示了如何删除行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4274544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档