2010-11-20 118 views
5

我的最終目標是讓JList在運行時刷新其內容,並且我找到了一個解決方案,從這篇文章here on SO起作用,但我很好奇爲什麼我原來的想法沒有。將JList .setModel()方法與類作爲參數使用

截至目前,我有這樣的事情設置和它的工作原理:

DefaultListModel default = new DefaultListModel(); 

for(int i = 0; i < array.size() ; ++i){ 
    test.addElement(array.get(i)); 
} 
list.setModel(default); 

下面是我原來的計劃。我希望有一個實現了ListModel的類作爲參數傳遞,希望它會刷新JList。

SomeClass test = new SomeClass(); //Implements ListModel 
list.setModel(test); 

SomeClass test = new SomeClass(); //Implements ListModel 
list = new JList(test); 

無論這些工作,這讓我困惑的。這些最後兩種方法可以工作一些,代碼是如此乾淨。

謝謝。

+0

傳遞類ListModel而不是此類的實例是編譯器錯誤。你爲什麼困惑? – Istao 2010-11-20 09:10:13

+0

我認爲我的代碼演示有點誤導對不起。那就是我正在做的事情,我會更改代碼以使其更清楚。 – Koop 2010-11-20 09:16:47

+1

爲什麼最後兩種方法不起作用?請提供您看到的錯誤。如果'SomeClass'擴展了'ListModel',那麼這兩種方法都可以工作。您的SomeClass代碼將很好地看到 – 2010-11-20 10:01:24

回答

3

如果您正確實施ListModel,第一種方法應該可以工作。關鍵是,當你改變你需要調用的數據時:

fireContentsChanged(...); 

from AbstractListModel(我假設你擴展了)。調用這個方法會告訴JList重繪自己。

第二種方法將無法正常工作,因爲您只是創建一個新的JList組件位於內存中。創建組件不會將其添加到GUI。所以如果你使用這種方法,你需要從GUI中刪除原來的JList,然後將新的JList添加到GUI中。這不是很方便,並且是不應該使用這種方法的一個很好的理由。設置模型始終是首選方法。

+0

是fireContentsChanged()應該是AbstractListModel還是自定義方法的一部分?此外,這是否通過所有的價值重申?謝謝。 – Koop 2010-11-20 19:22:42

+0

將ListModel添加到JList時,JList會向模型添加偵聽器。當您更改模型時,模型會通知視圖(列表)數據已更改,以便視圖可以重新繪製自身。這個通知是由屬於AbstractListModel的fireXXX方法完成的。這就是爲什麼當你創建一個自定義模型時,你應該擴展抽象模型,而不必重新發明輪子並通知視圖。你所要做的就是調用適當的fireXXX方法。 – camickr 2010-11-21 00:01:42

1

第一個案例在我看來似乎是一個解決方案。你能提供一個可測試的例子嗎?

第二種情況將不起作用,因爲您只是重用了一個變量,實際上並沒有改變Gui上的JList。我假設你已經在代碼中將這個列表添加到了這個人。

0

最有可能你的ListModel的實現是錯誤的。

相關問題