2011-06-03 72 views
20

我需要删除我的JTable中的所有行。删除JTable中的所有行

我曾尝试以下两项:

/** 
* Removes all the rows in the table 
*/ 
public void clearTable() 
{ 
    DefaultTableModel dm = (DefaultTableModel) getModel(); 
    dm.getDataVector().removeAllElements(); 
    revalidate(); 
} 

((DefaultTableModel)table.getModel()).setNumRows(0); 

均未将消除所有行。有任何想法吗?

+0

不应该重新验证吗? – MByD 2011-06-03 20:33:40

+0

@MByD我刚刚添加了revalidate(),但仍然看到相同的东西。我正在使用CustomeTableCellRenderer,但不会认为这会做太多。 – user489041 2011-06-03 20:36:07

+0

和重绘()在jtable? – MByD 2011-06-03 20:38:25

回答

30

下面的代码为我工作:

DefaultTableModel dm = (DefaultTableModel) getModel(); 
int rowCount = dm.getRowCount(); 
//Remove rows one by one from the end of the table 
for (int i = rowCount - 1; i >= 0; i--) { 
    dm.removeRow(i); 
} 
+0

真棒,对我的作品 – user489041 2011-06-03 20:43:23

+5

-1,其实,此代码不能正常工作。首先删除行0,然后所有行都向下移动1.然后删除行1,这意味着行0仍然存在。 James_Bond的回答显示了如何通过从头到尾删除而不是从头开始。 – camickr 2011-06-04 01:42:54

+0

是的,你是对的,数组元素必须从后面移除。 – Mihai 2011-06-04 06:22:22

20

像这样的东西应该工作

DefaultTableModel model = (DefaultTableModel)this.getModel(); 
int rows = model.getRowCount(); 
for(int i = rows - 1; i >=0; i--) 
{ 
    model.removeRow(i); 
} 
+1

假设典型的阵列式支持,这比前后移除元素要好得多。 – 2011-06-03 21:05:05

+0

btw:它应该是DefaultTableModel,TableModel没有方法removeRow – AvrDragon 2012-09-25 07:34:35

+1

不需要循环,只需使用用于清除数据的api(不是太明显,但是你可能读了@camickr的答案 - 提到弃用方法) – kleopatra 2012-09-25 16:47:42

1

或者,如果你有很多行的却寥寥无几列...

DefaultTableModel dtm = new DefaultTableModel(); 
for(int i=0;i<NUM_COLS;i++) dtm.addColumn(COLUMN_NAME[i]); 
myTable.setModel(dtm); 

...用新的DTM代替旧的DTM。

+1

虽然可能,但不建议(特别是,因为它不是必需的,DTM _has_ api来删除它的所有行) - 这意味着旧模型的监听器必须重新连接到新模型。然而,不是火箭科学,只是不必要的复杂性;-) – kleopatra 2012-11-24 11:16:51

8

那么,setNumRows(0)应该可以工作,但如果你真的读了API,它会告诉你这个方法已经过时了,并告诉你使用哪个方法。

如果代码不起作用,那么你正在做其他的事情,我们不能从发布的代码告诉可能是什么。

发布您的SSCCE,证明存在问题。

4

删除从JTable中的所有行,只要使用这种方法,而不是最简单的方法...

tablemodel.getDataVector().removeAllElements(); 
tablemodel.fireTableDataChanged(); 

tablemodel是您创建了您的表中添加新行的模式。这是删除所有行的最短和最快的方式,因为如果您有成千上万的行,该怎么办?循环?

+0

可能看起来很简单 - 但是_wrong_:a)一般规则是永远不会从模型外部调用任何fireXX,通知其监听者是模型的独占责任本身。 b)DefaultTableModel _has_ api清除所有行(虽然名称不幸),但绝对不需要与底层数据结构交互 – kleopatra 2012-11-24 11:10:12

+0

@kleopatra您能解释一下您所说的规则吗?我不明白为什么我不能使用任何fireXX方法,当他们是公开的和默认实现访问! – Hazhir 2013-08-27 16:21:07

+0

这是一个设计意外,他们是公开的 - 简单的OO理智要求a)班级完全完成其工作,b)外部人永远不会接管别人负责的工作 – kleopatra 2013-08-28 06:45:15

42

我们可以使用DefaultTableModel.setRowCount(INT),用于这个目的,指的Java的文档:

公共无效setRowCount(int rowCount)

设置模型中的行数。如果新大小大于 当前大小,则将新行添加到模型末尾。如果 新大小小于当前大小,则索引rowCount为 和更大的所有行将被丢弃

这意味着,我们可以明确这样一个表:

DefaultTableModel dtm = (DefaultTableModel) jtMyTable.getModel(); 
dtm.setRowCount(0); 

现在,“怎么没有java的抛弃那些行”,我相信这只是调用一些C类无(无效* )最终或某些时候,或者它只是删除对该内存区域的所有引用,并留下供GC关注,文档不太清楚该函数如何在内部工作。

+1

伟大而简单的代码。虽然这个问题的标记答案也是正确的,但它在删除成千上万行时有问题。如果你正在处理数以千计的行,这段代码很简单。 – 2015-01-18 15:29:39

+1

这一个清除所有表格的行。简单和可用。谢谢 – 2015-05-07 14:06:21

+0

这是最好的答案。 – Antinous 2017-06-17 17:14:26

-1

试试看看这个代码。这将从JTable中删除所有行。

DefaultTableModel model=new DefaulTableModel(rows,cols); 
JTable table=new JTable(model); 
for(int i=0;i<model.getRowCount();i=i+0) 
{ 
model.removeRow(0); 
revalidate(); 
} 
+0

-1叹息 - 不正确答案的又一个变体...... **无**完全没有必要循环和**无**更少需要在该循环中重新验证任何内容 – kleopatra 2013-04-20 12:37:16

5
try{ 

    DefaultTableModel dtm = (DefaultTableModel) jTable2.getModel(); 

    dtm.setNumRows(0); 

}catch(Exception e){ 
} 
+1

没有什么新的比较给@camickr回答,是吗? – kleopatra 2013-06-25 11:50:04

1
DefaultTableModel tm = (DefaultTableModel) tbl.getModel(); 
while(tbl.getRowCount() > 0) 
{ 
    ((DefaultTableModel) tbl.getModel()).removeRow(0); 
} 
+0

虽然此代码可能有助于回答问题,但代码只有答案不是高质量。更好的答案可以解释代码的作用,告诉插入它的位置,解释为什么采用这种方法,并链接到相关文档。 – 2014-06-23 02:13:51

8

阅读API进行的DefaultTableModel - setRowCount方法支持删除/一气呵成丢弃所有的行...

((DefaultTableModel)myTable.getModel()).setRowCount(0);

+1

正确,但没有新东西:已经有[先前的答案](http://stackoverflow.com/a/15636607/203657)指向那个确切的方法:-)加上超过一个指向较旧的API .. – kleopatra 2014-01-21 15:50:06

0

我有多个表,所以我创建清除“任何”表格的方法:

private void deleteAllTableRows(JTable table) { 
    DefaultTableModel model = (DefaultTableModel) table.getModel(); 
    while(model.getRowCount() > 0){ 
     model.removeRow(0); 
    } 
} 
0
MyModel myTableModel = (MyModel) myTable.getModel(); 
for (int i = myTableModel.getRowCount()-1; i >= 0; i--) myTableModel.deleteRow(i); 
0
​​
+1

欢迎来到SO。仅限代码解答 - 请编辑您的答案以解释此代码为何回答问题,以及它如何工作。有关更多信息,请参阅http://stackoverflow.com/help/how-to-answer。 – 2016-06-12 02:57:25

+1

欢迎使用StackOverflow,请在答案中添加一些上下文。谢谢。 :) – 2016-06-12 03:13:20