ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JTable 소트(정렬)하기
    개발 2007. 6. 21. 00:48

    우선 간단하게 JTable을 만들어 보자.

    // 테이블을 생성한다.
    JTable table = new JTable();

    // 테이블을 올릴 스크롤페인을 생성한다.
    JScrollPane sp_table = new JScrollPane();

    // 테이블의 선택모드를 설정한다.(여기에서는 컨트롤키로 여러가지를 선택할 수 있도록 다중선택모드로 한다.)
    table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

    // 보더를 설정한다.(여기에서는 깔끔하기 보더는 없앴다.)
    sp_table.setBorder(BorderFactory.createEmptyBorder());

    // 테이블중 사용자가 없는 부분은 회색(기본색상)으로 나타나기 때문에 이부분은 뷰포트를 얻어서 백그라운드로 흰색을 준다.
    sp_table.getViewport().setBackground(Color.WHITE);

    // 헤더의 컬럼의 라벨을 내가 직접제어할 수있도록, 자동생성하는 것을 금지한다.       
    table.setAutoCreateColumnsFromModel(false);

    // 모델을 생성한다.
    AbstractTableModel table_model = new MyTableModel();

    // 테이블에 모델을 설정한다. 물론 테이블생성시 생성자에 모델을 추가해도 상관없다.
    table.setModel(table_model);


    여기까지만 해도 테이블을 스크롤 페인에 붙이면 작동하는데 문제가 없지만 소트 기능을 넣고 싶다면 다음의 메소드를 추가한다.

    table.setRowSorter(new TableRowSorter(table_model));


    setRowSorter() 와 TableRowSorter 클래스는 테이블에 소트기능을 넣기 위한 것으로
    JRE6 버전부터 지원한다.

    위의 소스를 컴파일하여 테이블의 헤더를 클릭하면 헤더에 따라 소트가 되는 것을 볼 수 있다.
    하지만 여기까지만 하면 문제가 있다.
    예를 들어보자.

    모델에 다음과 같이 정보가 들어있다고 하자.

    aaa
    ccc
    bbb


    위에서 ccc 사용자에게 다른 이벤트를 전달하기 위해서는
    int index = table.selectedRow(1);
    모델의 index 위치의 사용자에게 이벤트를 전달할 것이다.

    하지만 위와 같이 소트를 하게 되면 이렇게 변한다.(이런식으로 소트를 함)

    aaa
    bbb
    ccc


    그래서 다시 ccc 사용자에게 메세지를 전달하기 위해
    int index = table.selectedRow(2); 를 하지만...
    모델중 index의 사용자를 찾으면 실제로는 bbb 가 검출된다.
    사용자가 소트만 되었을 뿐 실제 저장되어 있는 모델에는 그 내용이 그대로 있기 때문이다.

    이것은 테이블의 convertRowIndexToModel(int) 메소드를 이용하여 해결할수 있다.
    위의 메소드는 눈에 보이는 Row의 인덱스를 넘겨주면, 실제 모델에 저장되어 있는 인덱스를 리턴해준다.
    즉 위의 같은 경우, ccc 를 찾는다면

    int index = table.convertRowIndexToModel(2);


    를 해주면 ccc가 보이는 인덱스 2를 리턴해주는 것이아니라
    실제 ccc가 들어있는 모델의 인덱스인 1을 리턴해준다.

    위의 테이블은 다중선택이 가능하기 때문에 여러개를 선택했다면

    int indexs[] = table.getSelectedRows();
    for(int i=0; i   indexs[i] = table.convertRowIndexToModel(indexs[i]);
    }

    이렇게도 할 수 있다.
    그럼 indexs[i] 값을 이용해서 실제 값들을 구하도록 하자.


    반응형

    '개발' 카테고리의 다른 글

    애플릿에서 브라우저 url 변경하기  (0) 2007.07.27
    toArray() 사용방법  (0) 2007.06.22
    vi 에디터의 북마크(책갈피) 달기  (0) 2007.06.20
    우분투에 APM 설치하기  (0) 2007.06.18
    JTextField 에 숫자만 입력받기  (0) 2007.06.10

    댓글

Designed by Tistory.