正在从DefaultTableModel对象中删除行



最近我遇到了一个奇怪的问题。每当我试图删除TableModelListener中属于DefaultTableModel对象的行时,我都会得到ArrayOutOfBounds Exception 0>=0,1>=1(取决于我的选择)。我在这里发现了类似的问题:

java.lang.ArrayIndexOutOfBoundsException:0>=0正在尝试填充JTable

然而,仍然无法修复它。我的目的是当用户在组合框中选择删除选项时,我只想完全删除那一行。顺便说一句,removeRow()方法在侦听器之外正常工作。以下是代码和说明:

String[] columnNames = {"Kargo ID",
                "Alıcı Adres",
                "Ağırlık(KG)",
                "Tutar(TL)",
                "Alım Saati","Durum","İletim Saati"};
        Object[][] data = {
                {new Integer(3), "Sinan Caddesi",
                    new Integer(100), new Integer(5),"" ,"",""}};

        final DefaultTableModel dtm = new DefaultTableModel(data,columnNames);
        final JTable table = new JTable(dtm){
            @Override
            public boolean isCellEditable(int row, int column) {
                return column == 5;//Combobox column
            }
        };
        //Making Combobox
        TableColumn c = table.getColumnModel().getColumn(5);
        JComboBox comboBox = new JComboBox();
        comboBox.addItem("");
        comboBox.addItem("Delete");
        c.setCellEditor(new DefaultCellEditor(comboBox));
        //System.out.println(dtm.getRowCount());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(false);
        //I printed row and column numbers, they re correct. 
        dtm.addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
                int column = e.getColumn();
                DefaultTableModel model = (DefaultTableModel)e.getSource();
                Object data = model.getValueAt(row, column);
                //System.out.println(data); DATA IS CORRECT
                if(((String)data).equals("Delete"))
                    dtm.removeRow(row);//Exception Here
                //System.out.println(row + " " + column);
            }
        });

我是不是漏掉了什么重要的一点?如有任何帮助,我们将不胜感激。

"非常"的基本思想是,当调用TableModel#setValue时,您希望检查已修改的column。如果column是(在这种情况下)5,您需要检查值是多少…

例如。。。

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    if (columnIndex == 5) {
        if ("Delete".equals(aValue)) {
            removeRow(rowIndex);
        }
    }
}

请记住,上面的示例覆盖了setValueAt的默认行为,因此,如果您依赖于在模型中更新的值,则需要调用super.setValueAt(...)

看看如何使用表

最新更新