移除 DefaultTableModel 的所有行

19

我想删除DefaultTable中的所有行。我在互联网上找到了两种常见的方法来删除它们,但是在我的DefaultTableModel中,这些方法都不存在,因此无法使用。我想知道为什么会这样。我使用DefaultTableModel的代码是

DefaultTableModel Table = (DefaultTableModel) Table.getModel();

一种删除的方法是

Table.removeRow(Table.getRowCount() - 1);

但是我的 DefaultTableModel 中没有此 removerow 方法。

6个回答

45
你可以将行数设置为0。 setRowCount(0) 来自文档的引用:
public void setRowCount(int rowCount)

设置模型中的行数。如果新大小大于当前大小,则在模型末尾添加新行;如果新大小小于当前大小,则删除索引为rowCount及更大的所有行。

但是,由于您也找不到removeRow,我怀疑您的模型变量可能没有被类型化为DefaultTableModel,而只是TableModel

在这种情况下,请将您的TableModel强制转换为DefaultTableModel,如下所示:

DefaultTableModel model = (DefaultTableModel) table.getModel();

我已经在使用这种类型转换,但是这个方法仍然不存在。 - Xara

15

为什么要把简单的事情复杂化,但是删除必须是迭代的。

if (myTableModel.getRowCount() > 0) {
    for (int i = myTableModel.getRowCount() - 1; i > -1; i--) {
        myTableModel.removeRow(i);
    }
}

代码示例

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.*;

public class RemoveAddRows extends JFrame {

    private static final long serialVersionUID = 1L;
    private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
    private Object[][] data = {
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)}
    };
    private JTable table;
    private DefaultTableModel model;

    public RemoveAddRows() {

        model = new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                int firstRow = 0;
                int lastRow = table.getRowCount() - 1;
                int width = 0;
                if (row == lastRow) {
                    ((JComponent) c).setBackground(Color.red);
                } else if (row == firstRow) {
                    ((JComponent) c).setBackground(Color.blue);
                } else {
                    ((JComponent) c).setBackground(table.getBackground());
                }
                /*if (!isRowSelected(row)) {
                String type = (String) getModel().getValueAt(row, 0);
                c.setBackground("Buy".equals(type) ? Color.GREEN : Color.YELLOW);
                }
                if (isRowSelected(row) && isColumnSelected(column)) {
                ((JComponent) c).setBorder(new LineBorder(Color.red));
                }*/
                return c;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
        JButton button1 = new JButton("Remove all rows");
        button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                if (model.getRowCount() > 0) {
                    for (int i = model.getRowCount() - 1; i > -1; i--) {
                        model.removeRow(i);
                    }
                }
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JButton button2 = new JButton("Add new rows");
        button2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
                model.addRow(data0);
                Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
                model.addRow(data1);
                Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
                model.addRow(data2);
                Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
                model.addRow(data3);
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JPanel southPanel = new JPanel();
        southPanel.add(button1);
        southPanel.add(button2);
        add(southPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        RemoveAddRows frame = new RemoveAddRows();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

不把简单的事情复杂化的原因是为了避免像你在这里所犯的错误:if语句是多余的,它不会删除索引0处的行,并且会不必要地为每一行触发一个事件。 - Walter Laan
@Walter Laan,感谢您指出愚蠢的错误,但对于其余部分,我只是不同意,这里的答案也是如此。 - mKorbel
以下的答案更简单,即使用 setRowCount(0); - Marcos Pereira

14

你尝试过这个吗? 这个对我有效。

defaultTableModel.setRowCount(0);

10

为什么不阅读DefaultTableModel的javadoc呢?

public void removeRow(int row)

从模型中删除行row。将向所有侦听器发送有关删除行的通知。

public void setDataVector(Vector dataVector, Vector columnIdentifiers)

用新的行Vector dataVector替换当前dataVector实例变量。

public void setRowCount(int rowCount)

设置模型中的行数。如果新大小大于当前大小,则在模型末尾添加新行;如果新大小小于当前大小,则丢弃索引rowCount及更大的所有行。


3

只需不断删除表格模型的第一行,直到没有更多行为止。

// clean table
DefaultTableModel myTableModel = (DefaultTableModel) this.myjTable.getModel(); 
while (myTableModel.getRowCount() > 0) {
       myTableModel.removeRow(0);
}

0

你可以编写一个方法

public void clearTable()
  {
    getTableModel().setRowCount(0);
  }

然后从需要清除表格的地方调用此方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接