2013-06-25 2 views
0

에 추가 된 행을 지속하기 :스크롤 내가 더 많거나 적은 지속적으로 업데이트하는 JTable가, 채우기 위해의 HashMap을 사용 JTable의

공공지도를 < 긴, ​​MyObject를> tableData = 새로운 HashMap의 < 롱, MyObject를> ();

새로운 요소가 테이블 모델이 통지되는 맵에 추가 될 때마다 :

나는 특정 기준에 따라 행을 정렬 TableRowSorter를 가지고 또한
tableData.put(id, anObject); 

AbstractTableModel atm = (AbstractTableModel)model; 
atm.fireTableDataChanged(); 

:

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
. 
. 
. 
table.setRowSorter(sorter); 

내 목표는 아마도 (수직) 스크롤바가 마지막으로 추가 된 행으로 점프하는 것인데, 이것은 아마도이 분류기 때문에 테이블의 중간에있는 에있을 수 있습니다 :

table.scrollRectToVisible(table.getCellRect(row,0, true)); 

문제는 행의 인덱스를 모른다는 것입니다.이 인덱스를 얻으려면 어디에서 연결할 수 있습니까? 잠재적으로 정렬 된 테이블에 새로 삽입 된 행 스크롤

+0

관련없는 : a) 결코 모델 대신 이벤트를 실행하지 말고 대신 알림 계약 자체를 수행하는 API를 수정하여 사용자 지정 모델을 구현하십시오. b) 가능한 가장 좁은 이벤트를 항상 발생시킵니다. update/insert (대 샷건 dataChanged) c) rowSorter가 일반 코어 버전 인 경우 수동으로 만들고 설정하는 대신 table.setAutoCreateRowSorter (true)를 사용하는 것이 좋습니다. – kleopatra

답변

8

좌표

  • 테이블 모델 볼 이벤트 (이 모델 coordiates이다)의 rowIndex에 변환
  • 변화 듣고 포함
  • 코드의 뷰 위치

스크롤 :

final JTable table = new JTable(); 
TableModelListener l = new TableModelListener() { 

    @Override 
    public void tableChanged(TableModelEvent e) { 
     if (TableUtilities.isInsert(e)) { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        int viewRow = table.convertRowIndexToView(e.getFirstRow()); 
        table.scrollRectToVisible(table.getCellRect(viewRow, 0, true));  
       } 
      }); 
     } 
    } 
}; 
table.getModel().addTableModelListener(l); 

두 가지 중요한 측면 :

  • 올바른 이벤트가 발생해야합니다 모델 된 구현, 즉 인덱스 변환 및 스크롤 보장을 모두 불러서 dataChanged
  • 삽입 아닌 것을 듣고있다 테이블 (모델)은 모델 변경에 따라 모든 내부 상태를 업데이트했습니다.
+0

하지만이 위치는 어디에 추가할까요? – user1703554

+0

f.i. 모델에 청취자에서 – kleopatra

+0

@ kleopatra 흠,하지만 수신기에서 나는 modelRow을 모르겠다 – user1703554

관련 문제