2013-08-27 3 views
0

JTable을 사용하면 열 머리글을 클릭 할 때 열이 정렬되지만 그 열 이름을 마우스 오른쪽 단추로 클릭하면 함수 이름 'sort'가 표시되어야한다는 것을 알고 있습니다. 그것을하는 어떤 제안?열을 정렬하는 jTable에 함수를 추가하는 방법은 무엇입니까?

+0

왜 사용자에게 어려움이 있습니까? – kleopatra

+0

@kleopatra 실제로 열 머리글을 클릭 할 때 실수로 열을 정렬하지 않기 때문에 클라이언트에서 요구하는 것입니다. :) – John11

답변

2

, 당신은 보통 왼쪽 클릭으로의 대신 (팝업에서 f.i. 트리거) 어떤 명시적인 작용에 의해 정렬 할 예제 Sorting and Filtering를 확인하십시오.

그렇다면 위변조는 아무 것도하지 않는 것이 좋습니다. UI 위양에 의해 설치된 기본 마우스 수신기에

  • 후크, described in a recent QA
  • 과 UI가 물건을 할 수 있도록하지만, (규칙을 준수하지 않는 분류기 구현하여 바보 : 두 가지 옵션이 있습니다을 조심 : 그 첫 번째 방법처럼 더러운)

침습 행동하는 분류기!

public class MyTableRowSorter extends TableRowSorter { 

    public MyTableRowSorter(TableModel model) { 
     super(model); 
    } 

    /** 
    * Implemented to do nothing to fool tableHeader internals. 
    */ 
    @Override 
    public void toggleSortOrder(int column) { 
    } 

    /** 
    * The method that really toggles, called from custom code. 
    * 
    * @param column 
    */ 
    public void realToggleSortOrder(int column) { 
     super.toggleSortOrder(column); 
    } 

} 

// 사용

final JTable table = new JXTable(new AncientSwingTeam()); 
table.setRowSorter(new MyTableRowSorter(table.getModel())); 
Action toggle = new AbstractAction("toggleSort") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JXTableHeader header = SwingXUtilities.getAncestor(
       JXTableHeader.class, (Component) e.getSource()); 
     Point trigger = header.getPopupTriggerLocation(); 
     int column = trigger != null ? header.columnAtPoint(trigger) : -1; 
     if (column < 0) return; 
     int modelColumn = header.getTable().convertColumnIndexToModel(column); 
     ((MyTableRowSorter) header.getTable().getRowSorter()) 
      .realToggleSortOrder(modelColumn); 
    } 
}; 
JPopupMenu menu = new JPopupMenu(); 
menu.add(toggle); 
table.getTableHeader().setComponentPopupMenu(menu); 

그래, :-) 일반 스윙으로 저를 게으른, 당신은 더 몇 줄을 작성해야하지만, 기본은 동일, 일부 SwingX API를 던지 저항 할 수 없었다 : 설치 교묘 한 분류기 및 사용자 정의 토글을 사용 정말 정렬 필요, fi mouseListener를 작성합니다.

관련 문제