java - 从 DefaultTableModel 对象中删除行

标签 java swing jtable actionlistener

最近遇到一个奇怪的问题。每当我尝试删除属于 DefaultTableModel 对象的 TableModelListener 中的行时,我都会收到 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);
            }
        });

我是否遗漏了一些重要的观点?任何帮助将不胜感激。

最佳答案

“非常”基本的想法是,当 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

关于java - 从 DefaultTableModel 对象中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340588/

相关文章:

java - 使用 AbstractTableModel 从 JTable 中删除行

java - 如何在java中的rest url中传递从和到日期的列表

java - 向数据库返回一个 int 值

java - JTable 中的数组数据

java - Java中如何弹出图片

java - 在内部类中定义按钮 Action Vs 在 swing 的公共(public)类中定义按钮 Action

java - 调整 Jtable 的大小以填充 JFrame 并且仍然滚动

java - Spring Boot 请求 : to "re-run your application with ' debug' enabled"- how do I?

java - 如何传递参数/变量进行查询或变异?

带有反射的 java.lang.SecurityException