Java 源对象顺序属性更改时,数据列表更新

Java 源对象顺序属性更改时,数据列表更新,java,collections,glazedlists,Java,Collections,Glazedlists,我有一个orderProperty对象 class Car { private int order; // getter and setter implementation } 然后创建事件列表: EventList<Car> cars=new BasicEventList<Car>() for (i=0;i<10;i++) {Car car=new Car(i); cars.add(car);} EventList cars=new Basi

我有一个orderProperty对象

class Car
{
    private int order;

    // getter and setter implementation
}
然后创建事件列表:

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

对于(i=0;iQ):如何通知列表订单更改

可能的案例场景不一定是最好的

car类可以实现。然后在每个setter中,值更改之后,您可以通知侦听器

在创建列表的代码中,可以将侦听器添加到car中,以检查order属性的更改并重新排序列表

示例事件

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.
     }
  }
private SortedList sortedCars=new SortedList();
私有PropertyChangeListener listReorder=new-PropertyChangeListener(){
@凌驾
公共作废propertyChange(PropertyChangeEvent事件){
if(“order”.equals(event.getProperty()){
reoderCars();
}
}
公共布尔值addCarToOrderList(汽车){
/*省略安全代码*/
布尔结果=假;
if(分拣车包含(车)=false){
结果=分拣车。添加(车);
}
如果(结果){
car.addPropertyChangeListener(listReorder);//我们假设这是安全的
}
返回结果;
}
公共车辆{
已同步(此.sortedCar){
//将对列表进行排序的代码。
}
}

我发现了一个丑陋但简单的解决方案:调用集合。在orderProperty发生任何更改后进行排序(sortedCars、carsComparator)
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.
     }
  }