2010-01-14 2 views

답변

4

JTableRowSorter을 참조하는 중개자 클래스를 정의하고 각 분류기에 RowSorterListener으로 등록 할 수 있습니다. 주어진 분류기가 변경되면 getSortKets()을 사용하여 현재 정렬 키 목록을 검색하고 setSortKeys(List<? extends SortKey>)을 사용하여 다른 모든 분류기로 전달할 수 있습니다. 내가 그렇게 할 것

public void sorterChanged(RowSorterEvent e) { 
    // The changing flag prevents an infinite loop after responding to the inital 
    // sort event. 
    if (!changing) { 
     changing = true; 

     RowSorter changedSorter = e.getSource(); 
     List<? extends SortKey> keys = changedSorter.getKeys(); 

     for (RowSorter sorter : sorters) { 
     if (sorter != changedSorter) { 
      // Install new sort keys, which will cause the sorter to re-sort. 
      // The changing flag will prevent the mediator from reacting to this. 
      sorter.setSortKeys(keys); 
     } 
     } 
    } 
    } 
+0

문제는 테이블에 rowsorters가없는 것 같습니다. 'sortManager'조차도 null입니다. 그러나 정렬 열 헤더를 클릭하면 작동합니다. – Fortega

+0

그것은 그것이 JXTable이기 때문에 생각합니다. 나는 정렬이 테이블에 의해 처리되었다고 생각했지만 이제는 더 이상 확실하지 않습니다. – Fortega

+0

아 죄송합니다 - JXTable 인 것을 확인하지 못했습니다. JDK 1.6을 사용하고 있다면 JTable로 이동하는 것이 더 효율적으로 정렬되도록하는 것이 좋습니다. – Adamski

0

:

public class SortMediator implements RowSorterListener { 
    private final List<RowSorter> sorters; 
    private boolean changing; 

    public void addRowSorter(RowSorter sorter) { 
    this.sorters.add(sorter); 
    } 

    public void sorterChanged(RowSorterEvent e) { 
    ... 
    } 
} 

이제 우리는 주어진 분류기 이벤트에 응답 할 sorterChanged(RowSorterEvent e)을 구현 :

먼저 우리는 중재자 클래스를 정의 왜냐하면 그것은 사용자로부터 제어권을 빼앗기 때문입니다 : 다른 파이를 비교하기 위해 테이블을 다르게 정렬해야 할 수도 있습니다 데이터의 에이스.

대신보기 메뉴에 "정렬 기준"옵션을 추가하십시오. 이 옵션을 변경하면 모든 테이블이 정렬되지만 사용자가 특정 테이블을 정렬하지 않으면 해당 테이블을 그대로 둘 수 있습니다.

+0

동일한 방식으로 두 개의 테이블을 정렬하는 것이 중요한 경우가 있습니다. 예를 들어 스크롤 막대와 정렬 순서가 동기화되어 있어야하는 왼쪽 및 오른쪽 JTable로 구성된 "diff"보기를 작성할 때이 접근 방식을 사용했습니다. – Adamski

+1

물론 이것이 유용 할 때도 있습니다. 하지만 대부분의 경우 사용자 경험 관점에서 볼 때 매우 나쁜 생각입니다. 그것은 "최소한의 놀라움의 원칙"을 위반합니다. – kdgregory

관련 문제