Один и тот же наблюдаемый список в нескольких видах - PullRequest
1 голос
/ 18 октября 2011

У меня есть два представления (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);
}

Проблема IДело в том, что, поскольку оба представления используют один и тот же список каждый раз, когда в список добавляется один элемент, местоположение обновляется два раза, а объект, который движется в представлении, завершает свою анимацию в два раза быстрее.Я бы хотел, чтобы он обновлялся только один раз для каждого добавленного элемента.

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 ]

2 голосов
/ 18 октября 2011

На самом деле, я не понимаю, что вы ожидаете:

  • у вас есть главный список (myListData)
  • у вас есть два слушателя в этом основном списке
  • у вас есть две копии этого списка (otherList), содержащие такие же экземпляры , что и мастер
  • при получении добавления, каждый из двух слушателей манипулирует элементами в копии: этими элементами те же экземпляры, что и в мастере, поэтому они манипулировали дважды ..

Чтобы решить эту проблему, выполните манипуляции с элементами один раз за пределами представления, например, удерживая слушателяснаружи:

// frame
getDataList().addListener(....);
new View(getDataList());
// view
... do nothing
2 голосов
/ 18 октября 2011

Я думаю, что вы можете получить размер списка непосредственно из ObservableList, используя некоторый встроенный метод (size ())?, Вместо того, чтобы хранить отдельную переменную count. (В зависимости от того, что это за класс ObservableList.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...