[java] Swing GUI에서 validate (), revalidate () 및 invalidate ()의 차이점

Swing 구성 요소에는 특히 화면 레이아웃 업데이트와 관련된 여러 메서드가 있습니다.

Java 문서는 기술적 인 관점에서 이러한 내용을 다소 정의하고 있지만 사용 방법은 명확하지 않습니다.

이들의 차이점은 무엇이며 어떤 상황에서 다른 것보다 하나를 사용해야합니까?



답변

invalidate()컨테이너를 유효하지 않은 것으로 표시합니다. 콘텐츠가 잘못되어 다시 레이아웃해야 함을 의미합니다. 그러나 그것은 일종의 표식 / 깃발 일뿐입니다. 나중에 여러 개의 잘못된 컨테이너를 새로 고쳐야 할 수 있습니다.

validate()중계를 수행합니다. 이는 모든 크기에 대해 잘못된 콘텐츠가 요청되고 모든 하위 구성 요소의 크기가 LayoutManager에 의해 적절한 값으로 설정되었음을 의미합니다.

revalidate()둘 다의 합입니다. 컨테이너를 유효하지 않은 것으로 표시하고 컨테이너의 레이아웃을 수행합니다.

최신 정보:

Component.java의 일부 코드

public void revalidate() {
    revalidateSynchronously();
}

/**
 * Revalidates the component synchronously.
 */
final void revalidateSynchronously() {
    synchronized (getTreeLock()) {
        invalidate();

        Container root = getContainer();
        if (root == null) {
            // There's no parents. Just validate itself.
            validate();
        } else {
            while (!root.isValidateRoot()) {
                if (root.getContainer() == null) {
                    // If there's no validate roots, we'll validate the
                    // topmost container
                    break;
                }

                root = root.getContainer();
            }

            root.validate();
        }
    }
}


답변

validate(): Swing에서 Component를 생성 할 때 valid유효한 속성이 아닙니다 false. 구성 요소는 너비, 높이, 위치 및 항목이 결정되면 유효하다고합니다. 이는 일반적으로 validate()직접 또는 간접적으로 해당 메서드 를 호출하여 수행됩니다 . validate()컨테이너 를 호출 할 때 doLayout()일반적으로 .NET Framework를 호출하는 메서드 를 호출하여 컨테이너 (잘못된 경우)의 유효성을 검사 합니다 LayoutManager. 이제이 컨테이너에 배치 된 각 자식은 재귀 적으로 확인되므로 전체 트리가 배치되고 유효 해집니다.

revalidate(): revalidate()너비 / 높이에 영향을주는 속성을 변경할 때 호출되고 모양에 영향을주는 속성을 변경할 때 repaint ()를 호출합니다. 당신은 예를 들어, JFrame을 포함 JPanel, 지금은 시간의 특정 지점에서 당신은 제거 JPanel배치 새로의 내용에 따라 그 자리에 새로 삽입 JPanel, 내부 구성 요소의 크기 JPanel뿐만 아니라 The CONTAINER미덕 자체 ( 사용하는 레이아웃 관리자), 변경됩니다. 잘못된 상태로 푸시됩니다. 따라서이 변경 사항을 확인하려면 명시 적으로 revalidate().

invalidate(): 한 번도 사용 해본 적이 없어서 제공 할 수있는 정보가 많지 않을 수 있습니다. 그러나 위에 제시된 시나리오는 .NET을 사용할 때 어떤 일이 발생하는지에 대해 약간의 힌트를 줄 수있는 것 같습니다 invalidate().


답변