2009-03-17 3 views
0

GlazedLists를 사용하여 JScrollbarPane의 JTable과 함께 사용하기 위해 EventList에서 EventTableModel을 자동 생성합니다.뷰포트에서 JTable 선택 유지

나는 EventList를 FIFO로 사용하고 있으며, 많은 수의 요소가 끝에 추가 된 다음 여러 요소가 처음부터 제거되는 경우가 있습니다. 요소가 제거되면 선택 항목이 예상대로 작동합니다. 선택 항목의 색인이 변경 되었더라도 동일한 요소 (또는 적어도 테이블에있는 항목)가 선택됩니다. 훌륭합니다.

처음에 항목을 삭제할 때 개체가 색인을 변경하면 분명히 고정 된 범위의 개체와 고정 된 범위의 색인을 표시하는 뷰포트를 유지하는 것은 불가능합니다. 기본 동작은 뷰포트를 동일하게 유지하는 것 같습니다.

내가 선택한 객체를 뷰포트의 같은 위치에 유지하려면 어떻게 할 수 있습니까? (예 : EventTableModel 또는 JScrollbarPane 또는 기타 항목에 이벤트 리스너를 설정하고 처음부터 항목을 삭제할 때 뷰포트가 객체와 함께 이동하도록 오른쪽 스크롤 막대 설정을 계산합니다.)

답변

1

올바르게 호출되면 당신은 당신이 스크롤바를 조정할 필요가 없습니다 것입니다,하지만 당신은 특별히 RECT이 있어야 할 것을 명시 할 수 JTable로

public void scrollRectToVisible(Rectangle aRect) 

이런 식으로 arrowkeys을 사용하여 실제 스크롤을 수행하는 JViewport 에서 사용하는 JComponent의의 메소드 명백한. 단일 행의 행 번호와 픽셀 높이를 기반으로 한 계산을 포함 할 수 있습니다. 또한이 메서드에 중단 점을 넣을 수 있으며, 화살표 키로 Jtable을 통해 이동할 때 어떻게 동작하는지 확인할 수 있습니다.

0

ScrollPane 안에있는 JTable에서 첫 번째로 선택된 행을 표시하는 다른 방법은 수동으로 설정하는 것입니다 수직 스크롤 바가 표시하는 것 :

그래서 먼저 테이블에서 첫 번째로 선택된 행을 가져옵니다. 선택한 행이 여러 개인 경우에도 여전히 첫 번째 행을 가져옵니다.

int firstSelectedRow = table.getSelectedRow(); 

그런 다음 선택한 행이있는 위치 (예 : y 좌표)를 가져옵니다.

Rectangle cellLocation = table.getCellRect(firstSelectedRow, 0, false); 

마지막으로 수직 스크롤바의 위치를 ​​알려줄 수 있습니다.

scrollPane.getVerticalScrollBar().setValue(cellLocation.y); 

또한 선택된 행이 없으면 뷰포트가 테이블의 맨 위에 표시됩니다.

나는 scrollRectToVisible() 메서드를 사용하고 싶지만, 어떤 이유로 그것이 나를 위해 작동하지 않아서 매번 작동하는 것처럼 보입니다.

0

다음은 테이블에만 의존하는 다른 해결책입니다. 이 솔루션은 또한 새 뷰에서 선택한 행의 y 위치를 보존합니다.

는 먼저 우리는 우리의 선택이보기에 있다면 확인, 업데이트 후 업데이트 이전보기 및 선택 사각형

Rectangle preUpdateViewRect = table.getVisibleRect(); 
Rectangle preUpdateSelectedCellRect = table.getCellRect(table.getSelectedRow(), 1, true); 

을 저장할. 이 검사는 사용자가 행을 선택하고 스크롤을 시작하면 뷰를 다시 선택 영역으로 스냅하지 않도록합니다.선택이 우리의 견해라면, 우리의 관점에서 같은 지점에 선택이있는 직사각형을 만드는 간단한 수학을하십시오.

if(preUpdateViewRect != null && preUpdateViewRect.contains(preUpdateSelectedCellRect)) 
{ 
    Rectangle postUpadteSelectedCellRect = table.getCellRect(table.getSelectedRow(), 1, true); 
    int newViewPortY = postUpdateSelectedCellRect.y - (preUpdateSelectedCellRect.y - preUpdateViewRect.y); 
    Rectangle newViewRect = new Rectangle(preUpdateViewRect.x, newViewPortY , preUpdateViewRect.width, preUpdateViewRect.height); 
    table.scrollRectToVisible(newViewRect); 
}