JPanel의 내용을 자주 바꾸려는 Swing 응용 프로그램을 만들고 있습니다. 이렇게하려면 removeAll()
을 호출 한 다음 새 컨텐츠를 추가 한 다음을 호출 revalidate()
합니다.
그러나 이전 콘텐츠는 여전히 실제로 볼 수 있습니다 (새로운 콘텐츠로 인해 가려져 있음). 에 추가하여 전화를 repaint()
추가하면 revalidate()
예상대로 작동합니다.
다른 경우에는 전화 revalidate()
만으로 충분 하다고 확신합니다 .
그래서 기본적으로 내 질문은-두 함수를 모두 호출해야하며 그렇지 않은 경우 언제 각각을 호출해야합니까?
답변
repaint()
와 전화해야합니다 revalidate()
. 전자는 Swing에게 창문의 영역이 더럽다는 것을 알려준다 removeAll()
. 후자는 레이아웃 관리자에게 레이아웃을 다시 계산하도록 지시합니다 (구성 요소를 추가 할 때 필요함). 이 원인이해야 자녀 재 페인트에 패널을하지만, 그 자체가 그렇게 할 수있는 패널을 일으키지 않을 수 (볼 이 재 페인트 트리거 목록 ).
보다 일반적인 참고 사항 : 원래 패널을 재사용하는 대신 새 패널을 만들고 부모에서 교체하는 것이 좋습니다.
답변
remove () 또는 removeAll ()을 수행 할 때마다
validate();
repaint();
새 구성 요소 추가 ()를 완료 한 후
remove ()를 수행 할 때는 validate () 또는 revalidate ()를 호출해야합니다. 관련 javadoc을 참조하십시오.
내 자신의 테스트에 따르면 repaint ()도 필요합니다. 왜 그런지 잘 모르겠습니다.
답변
revalidate
새 구성 요소가 추가되거나 이전 구성 요소가 제거되면 컨테이너에서 호출됩니다. 이 호출은 레이아웃 관리자에게 새 구성 요소 목록을 기반으로 재설정하도록 지시하는 명령입니다. revalidate
구성 요소가 ‘더러운 영역’이라고 생각하는 것을 다시 그리도록 호출합니다. 분명히 귀하의 모든 지역 JPanel
이 더러워진 것으로 간주 되는 것은 아닙니다 RepaintManager
.
repaint
구성 요소에 다시 페인트하도록 지시하는 데 사용됩니다. 종종 당신과 같은 상태를 정리하기 위해 이것을 호출 해야하는 경우가 있습니다.
답변
revalidate()
단순히 컨테이너 호출을 경험했을 때 컨테이너 레이아웃을 요청하면 revalidate()
하위 구성 요소 경계 업데이트가 repaint()
재 레이아웃 중에 경계가 변경 될 때 트리거 됩니다. 당신이 언급 한 경우 만 제거 된 구성 요소없이 구성 요소 경계는이 경우에는 변경되지 않습니다 repaint()
이다 “실수로” 트리거.
답변
예, repaint ()를 호출해야합니다. 재확인 (); removeAll ()을 호출하면 repaint () 및 revalidate ()를 호출해야합니다.