2012-06-20 96 views
2

我有一個實現TableModel接口的類。 當我在我的jTable上調用setModel並將我的類設置爲模型,然後調用jTable.updateUI();一切都很好。 但是在某些情況下,我想用不同的結構改變模型。顯示數據仍然正常工作,但我的列沒有更新。有沒有辦法強制我的表也刷新新模型的列?當模型更改時自動更新jtable列

+3

您的模型實現不正確。應用程序代碼_never_不會調用updateUI。 – kleopatra

回答

6

模型需要觸發相應的事件,例如:fireTableStructureChanged,如果數據和結構都發生了變化。

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire

+0

但我沒有擴展'AbstractTableModel'我正在使用接口 – soupdiver

+1

下面的鏈接(加+1)這個答案是正確的,你的太廣泛的問題,爲更好的幫助,儘快發佈[SSCCE](http:// sscce。 org /) – mKorbel

+2

最有可能的,你真的應該。 DefaultTableModel是一種非常以數據爲中心的方法,而不是面向對象的方法,這會導致許多設計問題。另一方面,自定義模型(通常基於AbstractTableModel)可以環繞對象列表。 – Puce

4
  • jTable.updateUI();是外觀和感覺相關的方法,不要使用

我有一個實現了TableModel接口的類。

+0

但是我的模型也是從'Observer'擴展的,所以我不能簡單地改爲擴展'DefaultTableModel' – soupdiver

+1

java.util.Observer是一個接口或者你在說什麼Observer? – Puce

+0

AH對不起,我的意思是'Observable' – soupdiver

-1

做方法如果像我一樣只是寫一個小小的黑客,你可以考慮使用.repaint()方法,而不是.updateUI()方法。

我用這個,因爲我不使用TableModel的,但我只是有數據的對象[] [],就像在太陽的第一個例子(以及Oracle)的教程

+0

不,不需要用一個行爲良好的模型重繪(注意:有一個驅動JTable的模型 - 雖然它可能是不可變的實現) – kleopatra

-1

試試這個(則setModel(myTableModel)後插入;線):

myJTable.createDefaultColumnsFromModel(); 

在我的情況下,它解決了更新問題,而:.repaint(),.invalidate(),.fireTableDataChanged()沒有幫助。

+0

不,這不是方法通過應用程序代碼調用:在setModel上自動發生(前提是您沒有更改autoCreateColumns的默認true值)。如果它看起來有助於你的情況,其他地方有什麼不對 – kleopatra