我有两个使用相同域对象的视图(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,每个视图都会对列表进行迭代并更改对象的位置两次而不是一次。 谢谢你的帮助。
答案 0 :(得分:2)
我认为你可以使用一些内置的方法(size())直接从ObservableList中获取列表的大小,而不是必须保留一个单独的'count'变量。 (具体取决于此ObservableList
类的实现。)
答案 1 :(得分:2)
实际上,我不明白你的期望:
要解决这个问题,请在视图外部对元素进行操作,f.i。把听众留在外面:
// frame
getDataList().addListener(....);
new View(getDataList());
// view
... do nothing