2011-10-18 18 views
1

我有兩個使用相同域對象的視圖(JPanel)。我的域對象包含一個ObservableList同一觀察列表在幾個視圖

的ObservableList是一個LinkedList

private ObservableList<MyObject> listMyObject = ObservableCollections. 
    observableList(Collections.synchronizedList(new LinkedList<MyObject>())); 

在我的兩個觀點我每一個元素被添加到列表的時間做一些計算

protected class MyListDataListener implements ObservableListListener { 
    public void listElementsAdded(ObservableList list, int index, int length) { 
    MyObject obj = (MyObject)list.get(index); 
    Poin2D location = obj.getObjLocation(); 
    location.setLocation(location.x + (time/getWidth()), location.y); 
    obj.setObjLocation(location); 
} 

我的問題是,由於雙方意見每次將一個元素添加到列表中時使用相同的列表位置更新兩次在視圖中移動的對象快兩倍地完成其動畫。我希望每增加一個元素都只更新一次。

public class MyFrame extends JFrame { 
public MyFrame() { 
View view1 = new View(domainObject.getMyDataList()); 
View view2 = new View(domainObject.getMyDataList()); 
} 
} 

public class View extends JPanel { 
private ObservableList<MyObject> listMyObject; 
private ObservableList<MyObject> otherList = ObservableCollections. 
    observableList(Collections.synchronizedList(new LinkedList<MyObject>())); 

public View(ObservableList<MyObject> listMyObject) { 
this.listMyObject = listMyObject; 
listMyObject.addListListener(new MyListDataListener()); 
} 

protected class MyListDataListener implements ObservableListListener { 
    public void listElementsAdded(ObservableList list, int index, int length) { 
otherList.add((MyObject)list.get(index)); 
for(MyObject obj : otherList) { 
Poin2D location = obj.getObjLocation(); 
    location.setLocation(location.x + (time/getWidth()), location.y); 
    obj.setObjLocation(location); 
} 
} 

如果我不創建view2,一切工作正常。在每次添加元素時都會創建view2,每個視圖迭代列表並更改對象的位置兩次而不是一次。 謝謝你的幫助。

+1

你能發佈更多的代碼來展示如何使用監聽器嗎? –

+0

哪個'ObservableList'? – trashgod

+0

不明白這個問題:如果列表觸發兩次,它的實現有些問題。如果列表沒有一個getSize()或類似的方法,並且它的實現也是錯誤的。如果在同一視圖(?)中對同一對象執行重定位時有兩個單獨的偵聽器,則使用代碼 – kleopatra

回答

2

其實,我不明白你所期望的:

  • 你有一個主列表(myListData)
  • 你有兩個監聽器主列表
  • 你有含有相同實例作爲主
  • 上receving附加該列表(otherList)的兩個副本,兩個偵聽的操縱在所述元件副本:那些元素是相同實例作爲在主,所以他們操縱兩次..

爲了解決中,執行元件的操作一旦視圖,f.i.以外通過讓聽衆保持外部:

// frame 
getDataList().addListener(....); 
new View(getDataList()); 
// view 
... do nothing 
+0

好的,這就是我將要嘗試做的事情,但將視圖外部的偵聽器移動到我的計算元素上會很煩人。令人討厭但可能的,所以我會這樣做。謝謝。 – xtrem06

2

我認爲你可以直接從ObservableList中使用一些內置方法(size())?來獲取列表的大小,而不必保留一個單獨的'count'變量。 (什麼實現根據本ObservableList類,這是)

+0

ObservableList實現是一個LinkedList。計算比單純計算++要複雜一些,在這種情況下列表的大小沒有用處。我更新了我的問題。 – xtrem06