【问题标题】:Removing Row from DefaultTableModel Object从 DefaultTableModel 对象中删除行
【发布时间】:2013-12-18 21:16:47
【问题描述】:

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

java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 attempting to populate 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);
            }
        });

我错过了一些重要的点吗?任何帮助将不胜感激。

【问题讨论】:

  • 使用TableModelListener 不是修改表模型的适当方法,因为当您修改表模型时,表模型将触发另一个表更改事件,依此类推...采取查看this example 以获得更好的想法
  • 那么如何监听表中的数据变化呢?我已经尝试将 actionListener 添加到组合框而不是表,但结果是一样的。
  • 监听更改和根据这些更改进行修改是两件不同的事情。看看链接的例子

标签: java swing jtable actionlistener


【解决方案1】:

“非常”的基本思想是,当调用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(...)

看看How to use tables

【讨论】:

  • 我真的不知道该说什么。真的,真的非常感谢你。我刚刚创建了扩展到 DefaultTableModel 的内部类,覆盖了 setValueMethod 并从我的内部类而不是直接从 Dtm 类定义了新对象。工作完成了。祝你今天过得愉快 ! ^_^
猜你喜欢
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2017-01-20
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多