Глазированные списки Обновление SortedList при изменении свойства порядка исходных объектов - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть какой-то объект с orderProperty

class Car
{
    private int order;

    // getter and setter implementation
}

Затем я создаю EventList:

EventList<Car> cars=new BasicEventList<Car>()
for (i=0;i<10;i++) {Car car=new Car(i); cars.add(car);}

Затем я создаю SortedList на основе машин, чтобы использовать его для TableModel

SortedList<Car> sortedCars=new SortedList<Car>(cars,carsComparator);

Вот компаратор:

Comparator<Car> carsComparator implements Comparator<Car>
{
            @Override
            public int compare(Car o1, Car o2) {
                return o1.getOrder() - o2.getOrder();
            }
}

В программе есть некоторые события, которые изменяют свойство car.order.Как уведомить Списки об этих изменениях?

1 Ответ

0 голосов
/ 28 сентября 2011

В: Как уведомить Списки об изменении заказа?

Возможный сценарий не обязательно лучший.

Автомобиль класса может реализовать шаблон проектирования Observer .Затем в каждом установщике после изменения значения вы можете уведомить об этом слушателей.

В коде, в котором вы создаете список, вы можете добавить слушатель к автомобилю, который проверяет изменение свойства заказа и переупорядочивает список.

Пример события

public class PropertyChangeEvent extends EventObject {

  private final String propertyName;
  private final Object oldValue;
  private final Object newValue;

  public PropertyChange(String propertyName, Object oldValue, Object newValue) {
     this.propertyName = propertyName;
     this.oldValue = oldValue;
     this.newValue = newValue;
  }

  public String getProperty() {

   reutnr this.propertyName;
 }

  //Rest of getters were omitted. 

}

И слушатель

public abstract interface PropertyChangeListener extends EventListener {

   public abstract void propertyChange(PropertyChangeEvent event);

}

Затем вы должны написать класс, который будет поддерживать изменение свойства, должен иметь такие методы, как addPropertyChangeListener (PropertyChangeListener pcl), firePropertyChange (PropertyChangeEvent pce).

Когда менеджер изменения свойств выполнен.Единственное, что вам нужно сделать, это.

public class Car { 

    private PropertyChangeManager manager = new PropertyChangeManager(Car.class);


    /* The omitted code*/

    public void setOrder(int order) {
      int oldValue = this.order;
      this.order = order;
      manager.firePropertyChange("order", oldValue, this.order);
    }

    public void addPropertyChangeListener(PropertyChangeListener pcl) { 
     this.manager.addPropertyChangeLIstener(pcl);
   }
}

И в классе, где вы используете этот список.

    private SortedList<Car> sortedCars=new SortedList<Car>();

    private PropertyChangeListener listReorder = new ProprtyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent event) {

            if("order".equals(event.getProperty()) {
               reoderCars();
            }

        }

   public boolean addCarToOrderList(Car car) {
          /* Safety code omitted  */

        boolean result = false;

        if(sortedCars.contains(car) == false) {
           result = sortedCars.add(car);
         }

        if(result) {
            car.addPropertyChangeListener(listReorder); //We assume that this is safe
        }

       return result;
    }

   public void reoderCars() {

     synchronized(this.sortedCar) {
      //the code that will sort the list.
     }
  }
...