java - 未从 JTable 中删除的行

标签 java swing jtable tablemodel

在我的 JTable 中,我所有的复选框都在第 3 列中。在我点击一个按钮后,它将 删除那些选中的行。

但是在我的 onclick 中实现这些功能之后。它不会删除行。

按钮监听器的方法

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(); 
            }
        }       
    }
}

这就是我的 AbstractTableModel 类中的内容

@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);
    }
}

最佳答案

您需要从模型中的实际数据(即数组数据)中删除该行。 fireTableRowsDeleted 是不够的。那只是更新 ui 的东西。但请记住,您使用的是数组。因此,您需要根据数据相应地推进行索引。最好使用 List 以便于操作。另请记住,您正试图在循环中“同时”删除行。因此,如果您删除一行,则还需要在循环中递减该行。

另外正如@AndrewThompson 提到的,只需使用 DefaultTableModel .我没有看到您的模型有什么特别之处需要定制模型。

这是一个 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();
            }
        });
    }
}

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

相关文章:

java - 使用GridLayout时如何在JPanel底部添加ScrollBar?

java - AbstractTableModel 中的对象初始化

java - 使用 GridBagLayout JTables 和 JScrollPane 不起作用

Java XAMPP 连接性

java - Android AsyncTask 中的 ConcurrentModificationException

java - JNDI 连接适用于 Tomcat,但不适用于 Websphere

java - JPanel 设计问题

java - JTextField 字符串不起作用

java - FileObserver 无法在 Android 6 上运行,可替代在 Android 上检测屏幕截图

java - 将 slf4j 与 log4j 结合使用。在 tomcat 中部署时未在文件中创建日志