2011-09-28 38 views
0

我有一些物体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);} 

然后,我创建排序列表基于汽车使用它的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属性。如何通知有关此更改的列表?

+0

我发现了一个丑陋但简单的解决方案:在任何订单属性更改后调用Collections.sort(sortedCars,carsComparator) –

回答

0

问:如何通知有关订单更改的列表?

可能的情况不一定是最好的情况。

该班车可以执行Observer design pattern。然后在每个制片人之后,可以通过更改值来通知听众。

在创建列表的代码中,您可以将侦听器添加到汽车中,以检查订单属性更改并重新排列列表。

中的示例事件

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. 
    } 
    }