Java Swing revalidate () vs repaint ()
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 ()를 호출해야합니다.
참고 URL : https://stackoverflow.com/questions/1097366/java-swing-revalidate-vs-repaint
'IT story' 카테고리의 다른 글
<% $, <% @, <% =, <% #… 거래는 무엇입니까? (0) | 2020.05.06 |
---|---|
C #에서 C ++ 스타일의 'friend'키워드를 제공하지 않는 이유는 무엇입니까? (0) | 2020.05.06 |
너비 속성의 CSS \ 9 (0) | 2020.05.06 |
msbuild로 웹을 게시하는 방법? (0) | 2020.05.06 |
Rails : respond_to 블록은 어떻게 작동합니까? (0) | 2020.05.06 |