2012-11-19 2 views
1

DefaultListModel을 정렬하고 내용이 변경된 이벤트를 실행하고 싶습니다.하지만이 이벤트가 계속 발생하여 fireContentsChanged 메소드를 호출하는 방법을 이해할 수 없습니다. 내 모델이 AbstractListModel을 확장하면 정렬 후 fireContentsChanged를 직접 호출 할 수 있지만 DefaultListModel을 사용하여 클래스를 작성한 것처럼 해당 액세스를 보호 한 fireContentsChanged를 호출 할 수 없다는 것을 알았습니다. AbstractListModel 을 확장해야합니까, 아니면 DefaultListModel fireContentsChanged를 호출 할 수 있습니까?DefaultListModel 정렬

public class DefaultDataModel implements DataModel 
{ 
    private DefaultListModel<Data> dataModel = new DefaultListModel<>(); 
    @Override 
    public void addElement(Data data) { 
    dataModel.addElement(data); 
    } 
    @Override 
    public int getSize() { 
    return dataModel.getSize(); 
    } 
    @Override 
    public Data getElementAt(int idx) { 
    return dataModel.getElementAt(idx); 
    } 
    @Override 
    public void addListDataListener(ListDataListener l) { 
    dataModel.addListDataListener(l); 
    } 
    @Override 
    public int indexOf(Data data) { 
    return dataModel.indexOf(data); 
    } 
    @Override 
    public List<Data> getAllData() { 
    return Collections.list(dataModel.elements()); 
    } 
    @Override 
    public void sort() { 
    Collections.sort(getAllData()); 
    } 
} 
+0

모든 요소를 ​​정렬 한 후 또는 정렬하는 동안 항목의 위치가 변경 될 때마다 "fireContentsChanged"메소드를 호출 하시겠습니까? –

+0

위치가 변경 될 때마다 가능하다는 것을 몰랐습니다. 필자의 경우 모든 요소가 정렬 된 후에 fireContentsChanged를 호출하면되지만 항목 위치가 변경 될 때마다 수행하는 방법은 신경 쓰지 않아도된다고 생각합니다. – jerome

답변

0

sort 메소드에서 수행하는 방법을 찾았습니다. dataChanged 메소드를 dataModel 리스너 목록에서 호출해야합니다.

@Override 
    public void sort() { 
    Collections.sort(getAllData()); 
    ListDataListener[] listeners = dataModel.getListDataListeners(); 
    for(ListDataListener listener : listener) { 
    listener.contentsChanged(dataModel, ListDataEvent.CONTENTS_CHANGED, 0, getSize()); 
    } 
    }