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


111

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

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

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

답변:


67

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();
        }
    }
}

3
revalidate()호출하지 않습니다 doLayout()하는 validate()않습니다. 따라서 실제로 둘 다의 합 revalidate이 아닙니다. 항상 유효한 대체물은 아닙니다 validate.
Meo

그것은 AWT를위한 것입니다. 이것이
Meo

이 경우에는 RepaintManager가 validate를 호출 할 것입니다.
StanislavL

나는 추악한 버그를 다루고 있었고 revalidate를 validate (doLayout이라고 부르는)로 대체하여 해결했습니다.
Meo

정적 메서드에서 validate ()를 어떻게 호출 할 수 있습니까?
Kunal Tyagi

69

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().


1
invalidate()여러 구성 요소를 업데이트하고 마지막으로 revalidate()또는으로 레이아웃을 다시 계산하기 전에 유효하지 않은 것으로 표시하고 싶을 때 유용 하다고 생각 합니다 validate().
Qix-MONICA는

1
@Qix : IMHO, 자동으로 호출되기 때문에 invalidate () 를 호출 할 필요가 없습니다 . 또한 revalidate () 자체가 해당 작업을 수행합니다 (Java 문서에서 언급했듯이 invalidate ()및 둘 다 호출하는 편리한 방법으로 작동합니다 validate ()).
nIcE cOw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.