rows not deleted from JTable

▼魔方 西西 提交于 2020-01-05 18:24:32

问题


In my JTable, all my checkboxes are in column 3. after I onclick a button, it will remove those rows that are checked.

But however after implementing the functions in my onclick. It does not remove the the rows.

The method for the button listener

class DeleteBtnListener implements ActionListener {  
    @Override
    public void actionPerformed(ActionEvent arg0) {
        for(int row = 0; row < table.getRowCount(); ++row) {
            if((Boolean) table.getValueAt(row, 3) == true) {
                myTableModel.removeRow(row);
                table.revalidate();
                table.repaint(); 
            }
        }       
    }
}

and this is what is in my AbstractTableModel class

@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel {
    private final boolean DEBUG = true;

    private String[] columnNames = {"Name",
            "Age",
            "Salary",
    "Delete"};

    private Object[][] data = {
            {"Kathy", "20",new Integer(5), new Boolean(false)},
            {"John", "35", new Integer(3), new Boolean(false)},
            {"Sue", "20", new Integer(2), new Boolean(false)},
            {"Jane", "12", new Integer(20), new Boolean(false)},
            {"Mary", "42", new Integer(10), new Boolean(false)}
    };

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    @SuppressWarnings("unchecked")
    public Class<?> getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int row, int col) {
        return true;
    }

    public void setValueAt(Object value, int row, int col) {
        if (DEBUG) {
            System.out.println("Setting value at " + row + "," + col
                    + " to " + value);

        }
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

    public void removeRow(int row) {
        fireTableRowsDeleted(row, row);
    }
}

回答1:


You need to remove the row from the actual data in your model (i.e. the array data). fireTableRowsDeleted is not enough. That just updates ui stuff. Keep in mind though, you are using an array. So you will need to advance the row indices accordingly with the data. Better use a List for easier manipulation. Also keep in mind you are trying to remove rows "concurrently" in the loop. So if you remove a row, you need to decrement the row in the loop also.

Also as @AndrewThompson mentioned, just use a DefaultTableModel. I don't see anything special about your model that warrants the need for a custom model.

Here's an example with DefaultTableModel

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestTable {


    private DefaultTableModel myTableModel = getModel();
    private JTable table = new JTable(myTableModel);

    public TestTable() {
        JButton button = new JButton("Remove All");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                for(int row = 0; row < table.getRowCount(); ++row) {
                    if((Boolean) table.getValueAt(row, 3) == true) {
                        System.out.println("true");
                        myTableModel.removeRow(row);
                        row--;
                    }
                } 
            }
        });

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.add(button, BorderLayout.PAGE_END);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private DefaultTableModel getModel() {
        String[] columnNames = {"Name",
                "Age",
                "Salary",
        "Delete"};

        Object[][] data = {
                {"Kathy", "20",new Integer(5), new Boolean(false)},
                {"John", "35", new Integer(3), new Boolean(false)},
                {"Sue", "20", new Integer(2), new Boolean(false)},
                {"Jane", "12", new Integer(20), new Boolean(false)},
                {"Mary", "42", new Integer(10), new Boolean(false)}
        };
        return new DefaultTableModel(data, columnNames) {
            @Override
            public Class<?> getColumnClass(int col) {
                switch(col) {
                case 0: 
                case 1: return String.class;
                case 2: return Integer.class;
                case 3: return Boolean.class;
                default: return Object.class;
                }
            }
        };
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new TestTable();
            }
        });
    }
}



回答2:


Can you try with DefaultTableModel that works perfectly. Override other methods of JTable if needed.

sample code:

DefaultTableModel model = new DefaultTableModel(data, columnNames);
final JTable table = new JTable(model) {
    @Override
    public Class<?> getColumnClass(int column) {
        switch (column) {
            case 2:
                return Integer.class;
            case 3:
                return Boolean.class;
            default:
                return String.class;
        }
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return true;
    }
};

To remove row call

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


来源:https://stackoverflow.com/questions/25338260/rows-not-deleted-from-jtable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!