2011-06-03 254 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