2011-06-24 117 views
3

假設我有一個帶有一些數據的JTable。對table.getValueForCell(row,col)的調用返回單元格的內容。這是預期的。排序JTable行問題

現在說我想排序我的表。我單擊表頭(列),然後對錶格進行排序。如果我使用row和col的相同值調用table.getValueForCell(row,col)。這裏現在有一個不同的行,因爲表已經排序。但是,table.getValueForCell(row,col)返回舊數據。看起來好像在保存表數據的基礎數據結構在排序時沒有更新。

任何想法如何解決這個問題,或者我可能做錯了什麼?

回答

2

來自針對JTable的documentation

JTable使用專有的整數 指行和它所顯示的模型的 列兩者。 JTable只是使用表格 範圍的單元格,並使用 getValueAt(int,int)在繪畫過程中從模型中檢索 值。 重要的是要記住, 所列的行和列索引返回的各種JTable方法都是根據 的JTable(視圖)而不是 必然與 模型使用的索引相同。

默認情況下,列可以在JTable使視圖的列 出現在不同的順序 在模型中的列重新排列 。這不 不會影響 模型的實現都:當列 重新排序,JTable中保持列的 新秩序內部 其列索引 之前轉換查詢模型。

因此編寫TableModel時,是 不必偵聽列 重新排序事件,該模型將 查詢在自己的座標系 不管什麼在 鑑於發生的事情。在實施例部分中有一個 示範排序算法0​​利用正是這種技術 的夾着另一個座標 系統,其中所述行的順序是 改變,而不是 列的順序。使用 RowSorter的底層TableModel 提供的排序和 過濾功能並不需要知道該怎麼辦 排序,而RowSorter的將處理 它同樣,當

。當使用基於行的 方法的JTable和底層的 TableModel時,座標轉換將是 。所有基於行的 行都基於RowSorter, ,它不一定與底層TableModel的 相同。例如,對於 示例,選擇總是在 條款的JTable中,因此在使用 RowSorter時,您需要使用convertRowIndexToView或 convertRowIndexToModel轉換 。下面 展示如何將座標從 JTable中轉換爲底層 模式:

而且還的Javadoc getValueAt:

public Object getValueAt(int row, int column) 

返回row和 單元格的值柱。

注意:該列在 表視圖的顯示順序中指定,而不是在 TableModel的列順序中指定。這是 的一個重要區別,因爲 用戶重新排列了 表中的列,在 的給定索引處的列將會改變。同時 用戶的操作不會影響 模型的列排序。

但是,您可以使用表格包裝,如this其他StackOverflow主題中所述。事實上,你調用的方法並不存在於JTable中,而且似乎已經來自該主題!希望這可以幫助。

+0

謝謝,這正是我需要的信息。我在看模型和視圖。當數據按相反順序排序時仍然有一些使用convertRowIndexToView()的問題。我不得不看看這個。但我會告訴你一些有趣的事情。你鏈接的其他帖子是我的包裝到JTable。我只是將該代碼更新到我的最新版本。但是很高興人們看着它,哈哈。 – user489041

+0

這很搞笑!很高興的信息是有幫助的,是的,它很高興看到你的帖子,如果已被使用:) – Perception

4

數據總是以其原始順序存儲在TableModel中。您可以使用以下方式訪問原始訂單:

table.getModel().getValueAt(...); 

每當對錶進行排序時,只有視圖發生更改。當您從表中獲取數據,你只需使用:

table.getValueAt(...); 

如果由於某種原因,你需要來回在兩者之間轉換,你可以使用的選擇恰當的表的方法:

convertRowIndexToModel(...); 
convertRowIndexToView(...); 
+0

謝謝,這是豐富的。讓我看看我是否理解正確。如果您希望數據最初放入表中,請使用table.getMode()。getValueAt()。如果您希望當前在表中顯示數據,請使用table.getValueAt()? – user489041

+0

當從'table.getSelectedRows()'(它們在'視圖空間'中)獲得行號並且想要與模型一起使用它們(其索引在'模型空間'中)時,您需要'convertRowIndexToModel(...)' ,另請參閱[TableRowSorter apidoc](http://docs.oracle.com/javase/6/docs/api/javax/swing/table/TableRowSorter.html) –