几个视图中的相同观察列表

时间:2011-10-18 05:52:54

标签: java swing

我有两个使用相同域对象的视图(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,每个视图都会对列表进行迭代并更改对象的位置两次而不是一次。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

我认为你可以使用一些内置的方法(size())直接从ObservableList中获取列表的大小,而不是必须保留一个单独的'count'变量。 (具体取决于此ObservableList类的实现。)

答案 1 :(得分:2)

实际上,我不明白你的期望:

  • 您有一个主列表(myListData)
  • 您在主列表上有两个听众
  • 您有两个包含相同实例的列表(otherList)的副本
  • 在接收添加时,两个侦听器中的每一个都操纵副本中的元素:这些元素是与主节点中的相同的实例,因此它们被操纵了两次..

要解决这个问题,请在视图外部对元素进行操作,f.i。把听众留在外面:

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