Java Swing revalidate () vs repaint ()


211

JPanel의 내용을 자주 바꾸려는 Swing 응용 프로그램을 만들고 있습니다. 이렇게하려면 removeAll()을 호출 한 다음 새 컨텐츠를 추가 한 다음을 호출 revalidate()합니다.

그러나 이전 콘텐츠는 여전히 실제로 볼 수 있습니다 (새로운 콘텐츠로 인해 가려져 있음). 에 추가하여 전화를 repaint()추가하면 revalidate()예상대로 작동합니다.

다른 경우에는 전화 revalidate()만으로 충분 하다고 확신합니다 .

그래서 기본적으로 내 질문은-두 함수를 모두 호출해야하며 그렇지 않은 경우 언제 각각을 호출해야합니까?


6
Oracle의이 자습서 에서는 "재확인 후 항상 다시 그리기를 호출합니다"라고 말합니다. 그러나 설명은 제공되지 않습니다.

답변:


154

repaint()와 전화해야합니다 revalidate(). 전자는 Swing에게 창문의 영역이 더럽다는 것을 알려준다 removeAll(). 후자는 레이아웃 관리자에게 레이아웃을 다시 계산하도록 지시합니다 (구성 요소를 추가 할 때 필요함). 이 원인이해야 자녀 재 페인트에 패널을하지만, 그 자체가 그렇게 할 수있는 패널을 일으키지 않을 수 (볼 재 페인트 트리거 목록 ).

보다 일반적인 참고 사항 : 원래 패널을 재사용하는 대신 새 패널을 만들고 부모에서 교체하는 것이 좋습니다.


1
왜 새 패널을 만드는 것이 이전 패널을 사용하는 것보다 더 나은 솔루션인지 합리화 할 수 있습니까? :)
Arttu

3
@Arttu-작업이 적으므로 오류가 발생하기 쉽습니다.
kdgregory

86

remove () 또는 removeAll ()을 수행 할 때마다

  validate();
  repaint();

새 구성 요소 추가 ()를 완료 한 후

remove ()를 수행 할 때는 validate () 또는 revalidate ()를 호출해야합니다. 관련 javadoc을 참조하십시오.

내 자신의 테스트에 따르면 repaint ()도 필요합니다. 왜 그런지 잘 모르겠습니다.


59

revalidate새 구성 요소가 추가되거나 이전 구성 요소가 제거되면 컨테이너에서 호출됩니다. 이 호출은 레이아웃 관리자에게 새 구성 요소 목록을 기반으로 재설정하도록 지시하는 명령입니다. revalidate구성 요소가 '더러운 영역'이라고 생각하는 것을 다시 그리도록 호출합니다. 분명히 귀하의 모든 지역 JPanel이 더러워진 것으로 간주 되는 것은 아닙니다 RepaintManager.

repaint구성 요소에 다시 페인트하도록 지시하는 데 사용됩니다. 종종 당신과 같은 상태를 정리하기 위해 이것을 호출 해야하는 경우가 있습니다.


5

revalidate()단순히 컨테이너 호출을 경험했을 때 컨테이너 레이아웃을 요청하면 revalidate()하위 구성 요소 경계 업데이트가 repaint()재 레이아웃 중에 경계가 변경 될 때 트리거 됩니다. 당신이 언급 한 경우 만 제거 된 구성 요소없이 구성 요소 경계는이 경우에는 변경되지 않습니다 repaint()이다 "실수로" 트리거.


-4

예, repaint ()를 호출해야합니다. 재확인 (); removeAll ()을 호출하면 repaint () 및 revalidate ()를 호출해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.