Sự khác biệt giữa validate (), revalidate () và validate () trong Swing GUI


111

Các thành phần xoay có nhiều phương pháp liên quan đến cập nhật bố cục màn hình, cụ thể là:

Tài liệu Java định nghĩa chúng phần nào từ góc độ kỹ thuật, nhưng không rõ ràng là chúng được sử dụng như thế nào.

Sự khác biệt giữa những thứ này là gì, và bạn nên sử dụng một cái thay vì những cái khác trong trường hợp nào?

Câu trả lời:


67

invalidate()đánh dấu vùng chứa là không hợp lệ. Có nghĩa là nội dung sai bằng cách nào đó và phải được trình bày lại. Nhưng nó chỉ là một loại dấu / cờ. Có thể nhiều vùng chứa không hợp lệ phải được làm mới sau đó.

validate()thực hiện chuyển tiếp. Điều đó có nghĩa là nội dung không hợp lệ được yêu cầu đối với tất cả các kích thước và tất cả các kích thước của thành phần con được LayoutManager đặt thành các giá trị thích hợp.

revalidate()chỉ là tổng của cả hai. Nó đánh dấu vùng chứa là không hợp lệ và thực hiện việc bố trí vùng chứa.

CẬP NHẬT:

Một số mã từ 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()không gọi doLayout(), mà validate()không. Vì vậy, nó không thực sự là tổng của cả hai - revalidatekhông phải lúc nào cũng thay thế hợp lệ cho validate.
Meo

Đó là đối với AWT, đây là cách xác thực lại trông giống như đối với Swing: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
Meo

Trong trường hợp này, tôi đoán (chưa bao giờ thử) RepaintManager sẽ gọi xác thực
StanislavL

Tôi đang đối phó với một lỗi xấu xí và thay thế revalidate bằng validate (gọi là doLayout) đã giải quyết được nó ...
Meo

Làm thế nào chúng ta có thể gọi validate () từ một phương thức tĩnh?
Kunal Tyagi

69

validate(): Trong Swing khi bạn tạo một Component, điều đó không có validnghĩa là thuộc tính hợp lệ của nó false. Một thành phần được cho là hợp lệ khi chiều rộng, chiều cao, vị trí và nội dung của nó đã được xác định. Điều này thường được thực hiện bằng cách gọi validate()phương thức của họ , trực tiếp hoặc gián tiếp. Khi chúng ta gọi validate()các vùng chứa, nó sẽ xác thực vùng chứa (nếu nó không hợp lệ) bằng cách gọi doLayout()phương thức của nó , phương thức này thường sẽ gọi LayoutManager. Bây giờ mỗi con được đặt trên vùng chứa này sẽ được xác thực đệ quy, do đó toàn bộ cây sẽ được bố trí và trở nên hợp lệ.

revalidate(): revalidate()được gọi khi bạn thay đổi một thuộc tính sẽ ảnh hưởng đến chiều rộng / chiều cao của chúng và gọi repaint () khi bạn thay đổi một thuộc tính sẽ ảnh hưởng đến sự xuất hiện của chúng. Ví dụ: nếu của bạn JFramecó chứa một JPanel, thì tại một thời điểm nhất định, bạn đã xóa cái đó JPanelvà chèn một cái mới vào vị trí của nó, tùy thuộc vào nội dung của tệp mới được đặt JPanel, kích thước của các thành phần bên trong JPanelcũng như The CONTAINERchính nó (do của trình quản lý bố trí được sử dụng bởi nó), các thay đổi. Điều này đẩy nó đến trạng thái không hợp lệ. Vì vậy, để xác thực thay đổi này, bạn phải gọi một cách rõ ràng revalidate().

invalidate(): Đây là thứ tôi chưa bao giờ sử dụng, vì vậy có thể không có nhiều thông tin tôi có thể cung cấp về nó. Nhưng có vẻ như các tình huống được trình bày ở trên có thể đưa ra một chút gợi ý, về những gì sẽ xảy ra khi sử dụng invalidate().


1
Tôi tin rằng invalidate()nó hữu ích khi bạn đang cập nhật một số thành phần và muốn đánh dấu chúng là không hợp lệ trước khi cuối cùng tính toán lại bố cục với revalidate()hoặc validate().
Qix - MONICA ĐƯỢC HỖN HỢP

1
@Qix: IMHO, không cần phải gọi voidate () vì nó đang được gọi tự động. Hơn nữa, bản thân revalidate () sẽ thực hiện tác vụ đó (Như đã nêu trong Java Docs, nó hoạt động như một phương thức thuận tiện để gọi cả hai invalidate ()validate ()).
nIcE vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.