2012-04-30 43 views
2

我需要一個插入行爲不同於TableRowSorter/DefaultRowSorter提供的JTable。當需要自定義插入行爲時,是否必須自定義RowSorter的實現?

我需要一個表格,以便當用戶插入一行時,新插入的行應該在光標所在的位置下方,並且光標位於新插入的行位置。 讓我說明它的一個示例:

初始狀態 - 表有4行:

0. Row 1 
1. Row 2 <-- cursor here 
2. Row 3 
3. Row 4 

用戶光標位於第2行,用戶觸發插入。新插入的行出現在下方,光標也移動到那裏:

0. Row 1 
1. Row 2 
2. New row <-- cursor here 
3. Row 3 
4. Row 4 

我很清楚我有兩種方法來解決此問題。

第一種方法是更改​​我的模型,因此插入在模型中的正確位置完成。我不喜歡這個解決方案,因爲它意味着模型索引將在插入的行下面的所有行中改變。這是最簡單的方法來完成我所需要的,但是,正如我所說的,代價是由於模型索引更改造成潛在的大開銷...

第二種方法是實現RowSorter,它將維護自己的videToModel []和modelToView []數組,並在插入行時保持正確的順序。當然,我開始通過擴展TableRowSorter,但問題是,modelToView和viewToModel是私有陣列,我無法訪問它們,所以我有問題時行過濾...

我想避免編寫我自己的RowSorter實現,因爲這需要時間把事情做對......

更新2013年10月7日: 我已經實現我自己的RowSorter的做到了這一點。經過兩種方法的實驗後,我意識到第二種方法給了我更多的靈活性。

+0

您是否知道在模型中插入數據的具體性能指標?如果沒有,我傾向於第一個選項 - 使用正確的模型索引(從所選行的視圖索引轉換)調用DefaultTableModel.insertRow()。 –

回答

1

獲得使用RowSorter正確排序的JTable的「正確」方式是覆蓋AbstractTableModel.getColumnClass(int)。然後您可以撥打DefaultRowSorter.setSortKeys()來指定排序順序。

這些方法將允許您以任何順序向/從您的模型添加/刪除行並滿足它們將以「正確的」排序順序顯示。

如果您需要特殊排序,即基於對象'compareTo()方法以外的其他排序,則可以撥打DefaultRowSorter.setComparator()提供您自己的比較功能以處理該列。

我不知道你所說的「光標」的意思,但如果你的意思是,任何新插入的行應選擇,這將通過調用JTable.setRowSelectionInterval(),這需要視點索引來完成,因此他們需要(例如,將您的模型索引,可能是您剛剛插入的模型中的最後一行轉換爲視圖索引)。

+0

羅布,我希望它很簡單! :)我看不出Comparator如何在這裏幫助我......我可能根本沒有SortKeys,但仍然希望插入發生在光標所在的行上! :)我知道如何選擇新插入的行,但無論如何要感謝。嘗試幫助+1! :) – DejanLekic

+0

啊!我現在看到 - 對不起,我通常需要解釋兩次。由於您的排序完全基於不在表格中的數據,我的第一本能是添加一個額外的隱藏列來保存「排序順序」。不知道這會很容易 - 讓我考慮一下,並編輯我的答案,如果它涉及到我。 –

+0

所以事實證明我喜歡你的第一個解決方案。我發佈了第二個答案,因爲這似乎完全關閉... –

1

不知道我是否應該編輯原始答案,但我認爲現在完全錯了。

我認爲你的第一個解決方案是最好的。我不會擔心在表格模型中插入數據的代價很高,直到我親眼看到它(或者如果你知道你有成千上萬的行或其他東西)。

所以 - 這樣的事情是什麼,我會去:

int modelIndex = table.convertRowIndexToModel(table.getSelectedRow()); 
tableModel.insertRow(modelIndex, myRowVector); 

DefaultTableModel代碼掃視了一眼,它看起來像這可能是一個比較快的方法,雖然有可能是周圍的Vector.insertElementAt()開銷沒有辦法...我願意打賭,這完全比使用RowSorter的開銷要低。

+0

它實際上與TableModel方法複雜...表可能被排序/篩選,並且我仍然想插入光標所在的行...(當前選中的單元格) – DejanLekic

+0

因此,表格可以通過獨立於此行插入的內容「排序」?這聽起來可能會令人困惑 - 插入的行是否總是獲得與排序順序相匹配的數據? –

+0

插入行時排序停止。這隻有意義...如果沒有,suer可能看不到插入的行,並且這可能會導致多次插入和麻煩。這就是爲什麼我希望用戶在光標下方看到新插入的行的主要原因 - 您會立即得到反饋,即插入行... – DejanLekic

相關問題