17

我想从 JTable 中删除一些行。我该怎么做?

4

6 回答 6

38

为了从 JTable 中删除一行,您需要从底层TableModel中删除目标行。例如,如果您的 TableModel 是DefaultTableModel的一个实例,您可以通过执行以下操作删除一行:

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove);
于 2009-07-13T06:29:33.650 回答
9

如果您需要一个简单的工作解决方案,请尝试使用DefaultTableModel

如果您已经创建了自己的扩展 AbstractTableModel 的表模型,那么您还应该实现 removeRow() 方法。确切的实现取决于您用来存储数据的底层结构。

例如,如果您使用过 Vector,那么它可能是这样的:

public class SimpleTableModel extends AbstractTableModel {
    private Vector<String> columnNames = new Vector<String>();
    // Each value in the vector is a row; String[] - row data;
    private Vector<String[]> data = new Vector<String[]>();

    ...

    public String getValueAt(int row, int col) {
        return data.get(row)[col];
    }

    ...

    public void removeRow(int row) {
        data.removeElementAt(row);
    }
}

如果你使用过 List,那么它会非常相似:

// Each item in the list is a row; String[] - row data;
List<String[]> arr = new ArrayList<String[]>();

public void removeRow(int row) {
    data.remove(row);
}

哈希映射:

//Integer - row number; String[] - row data;
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>();

public void removeRow(Integer row) {
    data.remove(row);
}

如果你使用像这样的数组

String[][] data = { { "a", "b" }, { "c", "d" } };

那么你就不走运了,因为没有办法从数组中动态删除元素。您可以尝试通过单独存储一些标志来通知哪些行被删除,哪些行不被删除,或者通过其他一些迂回的方式来使用数组,但我建议不要这样做......这会引入不必要的复杂性,实际上只是解决问题通过创建另一个问题来解决问题。这是一个肯定会在这里结束的方式。请尝试上述方法之一来存储您的表数据。

为了更好地理解这是如何工作的,以及如何使您自己的模型正常工作,我强烈建议您参考Java 教程DefaultTableModel API及其源代码

于 2009-07-14T07:16:38.213 回答
5

嗯很简单的家伙

for( int i = model.getRowCount() - 1; i >= 0; i-- )
{
    model.removeRow(i);
}
于 2010-12-27T00:36:23.570 回答
4

将过滤器应用于 JTable 的正确方法是通过添加到 TableRowSorter的RowFilter接口。使用此接口,可以在不更改底层模型的情况下更改模型的视图。这种策略保留了模型-视图-控制器范式,而从模型本身中删除您希望隐藏的行会通过混淆您的关注点分离来破坏范式。

于 2009-07-13T14:53:38.340 回答
3

JTable 通常构成 MVC 实现的 View 部分。您需要从模型中删除行。应该监听这些更改的 JTable 将更新以反映此删除。因此,您不会在 JTable 上找到 removeRow() 或类似方法。

于 2009-07-13T06:10:18.180 回答
3

查看 DefaultTableModel 以获得可以使用的简单模型:

http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

这扩展了 AbstractTableModel,但对于基本目的来说应该足够了。您始终可以扩展 AbstractTableModel 并创建自己的。确保您也将它设置在 JTable 上。

http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

有关将 JTable 与表模型一起使用的更多信息,请查看基本的 Sun 教程:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

于 2009-07-13T06:26:32.127 回答