2011-07-06 25 views
0

我是Java GUI新手,嘗試在SWING中使用jTable。我現在有一個我按照甲骨文的教程製成,它通過使用得到表中的數據:來自ArrayList對象的Java jTable數據和其他方法的更新

Object[][] data = { 
    {"Kathy", "Smith", 
    "Snowboarding", new Integer(5), new Boolean(false)}, 
    {"John", "Doe", 
    "Rowing", new Integer(3), new Boolean(true)}, 
    {"Sue", "Black", 
    "Knitting", new Integer(2), new Boolean(false)}, 
    {"Jane", "White", 
    "Speed reading", new Integer(20), new Boolean(true)}, 
    {"Joe", "Brown", 
    "Pool", new Integer(10), new Boolean(false)} 
}; 

我有一個包含項目對象的數量不受限制名爲訂單的對象,它有一個ArrayList(productsInOrder)。我正在試圖讓該表爲ArrayList中的每個對象顯示以下每個對象。 productsInOrder.getPrice()productsInOrder.getSKU()productsInOrder.getName()

任何人都可以指向正確的方向嗎?或者將我鏈接到一個教程,可以幫助我查看整個互聯網,無法弄清楚這一點。

最後,我在其他地方有一個動作偵聽器,當用戶執行某些動作時,它將更多的Product對象添加到ArrayList。我將如何更新jTable?簡單地通過在動作監聽器中重新加載整個jTable,或者是否有一種方法可以簡單地向表中添加另一行?

回答

3

或鏈接我的教程,可以幫助

您已經閱讀本教程是教程應該幫助你。

基本的解決方案是創建一個自定義TableModel。在這個例子中,他們將數據存儲在二維數組中。在你的情況下,數據將被存儲在ArrayList中。因此,您需要修改getVAlueAt()方法來訪問ArrayList,而不是2D數組。

最後,我在其他地方有一個動作偵聽器,當用戶執行某些動作時,會將更多Product對象添加到ArrayList。

你的代碼應該更新TableModel,而不是ArrayList。然後表格模型會通知表格。這意味着您需要在自定義TableModel中實現addRow(...)方法。

對於更復雜的解決方案,您可以創建一個可以使用的通用表模型。有關此方法的示例,請參閱Bean Table Model。 JButtonTableModel示例代碼顯示瞭如何僅爲您感興趣的屬性進一步自定義BeanTableModel。

+0

@Joseph Flynn我投票支持http://java.sun.com/products/jfc/tsc/articles/ChristmasTree/ @camickr +1 – mKorbel

+0

@camickr - 感謝指點我回到那個教程,重新閱讀是一個很大的幫助。我仍然不明白的一點是熱點更新表。我在其他地方使用ArrayList,所以我應該更新打擾自定義TableModel中的ArrayList和addRow(...)方法?這是不好的編碼習慣,因爲它會重複代碼?謝謝。 – Joseph

+0

正如我建議你應該直接更新TableModel,而不是ArrayList。 RowTableModel具有諸如addRow()和removeRow()之類的方法,因此您可以訪問各個對象。如果直接更新ArrayList,TableModel不知道數據已更改。在這種情況下,在你的代碼中更新ArrayList的地方,你還需要調用table.repaint()來強制重繪整個表,這不是一個好主意,因爲在MVC設計中,它是模型在數據發生變化時通知視圖。 – camickr

相關問題