IT story

Java Swing revalidate () vs repaint ()

hot-time 2020. 5. 6. 21:07
반응형

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

반응형