2016-09-09 10 views
1

JPanel이있는 JScrollPane이 있습니다. JPanel에는 많은 다른 구성 요소가 있습니다 (예 : Labels, JTextFields, JTextAreas). 이러한 구성 요소는 프로그래밍 방식으로 (런타임에 사용자 요청에 따라) 추가됩니다. JPanel은 SpringLayout을 사용합니다. 스크롤하지 않으면 계산이 제대로 수행되지 않기 때문에 구성 요소를 추가 한 후 JPanel의 기본 크기를 계산합니다. 구성 요소를 추가하고 기본 크기를 계산하는 것은 prepareGui() 메소드의 일부입니다. 구성 요소에 표시된 데이터는 주기적으로 새로 고쳐집니다 (청취자가 호출하는 내 refreshData() 메소드에서).데이터 새로 고침 후 스크롤 막대가 이동합니다.

내 문제 : 새로 고침 후 스크롤 막대는 항상 고정 위치로 설정됩니다 (이유를 모르겠습니다). 나는 상쾌하게 한 후에 스크롤 바를 낡은 위치에두기를 원한다.

스크롤 막대가 움직이는 곳을 찾으려고했습니다. 나는 시작과 refreshData() 메소드의 끝에서 일부 값을 확인하지만, 그들은 동일 (그들은 refreshData의 내부 변화하지 않았다()) :

scrollPane.getVisibleRect().getX() 
scrollPane.getVisibleRect().getY() 
scrollPane.getVisibleRect().getWidth() 
scrollPane.getVisibleRect().getHeight() 
panel.getVisibleRect().getX() 
panel.getVisibleRect().getY() 
panel.getVisibleRect().getWidth() 
panel.getVisibleRect().getHeight() 
scrollPane.getHorizontalScrollBar().getX() 
scrollPane.getHorizontalScrollBar().getY() 
scrollPane.getHorizontalScrollBar().getWidth() 
scrollPane.getHorizontalScrollBar().getHeight() 
scrollPane.getHorizontalScrollBar().getValue() 
scrollPane.getVerticalScrollBar().getX() 
scrollPane.getVerticalScrollBar().getY() 
scrollPane.getVerticalScrollBar().getWidth() 
scrollPane.getVerticalScrollBar().getHeight() 
scrollPane.getVerticalScrollBar().getValue() 

레이아웃 매니저의 변경은하지 않았다 효과.

한 가지를 눈치 챘습니다 (어떤 의미가 있는지는 알 수 없습니다). 원하는 크기 만 prepareGui()에 설정하면 스크롤 막대가 끝까지 이동합니다. 크기를 설정하면 스크롤바가 이상하고 고정 된 위치로 이동합니다.

어떻게 방지 할 수 있습니까? 스크롤 막대는 현재 위치를 유지해야합니다.

답변

1

JPanel 대신 JTextArea에 대한 주제에서 https://stackoverflow.com/a/5230477/5694159 (Johan M에게 감사함)이라는 답변을 찾았습니다. refreshData()가 별도의 스레드에서 호출되면 올바르게 작동합니다.

이 질문과 대답이 도움이되기를 바랍니다.