Різниця між validate (), revalidate () та недійсним () у GUI Swing


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, це як REVALIDATE виглядає як для свінгу: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk / ...
Мео

У цьому випадку я здогадуюсь (ніколи не пробував) RepaintManager зателефонує перевірити
StanislavL

Я мав справу з некрасивою помилкою і замінивши Revalidate валідатом (який викликає doLayout) вирішив це ...
Meo

Як ми можемо викликати validate () зі статичного методу?
Kunal Tiagi

69

validate(): У Swing при створенні компонента це не validє його дійсним властивістю false. Компонент, як кажуть, є дійсним, коли визначили його ширину, висоту, розташування та інше. Зазвичай це відбувається шляхом виклику їх validate()методу, прямо чи опосередковано. Коли ми зателефонуємо validate()на контейнери, він перевірить контейнер (якщо він недійсний), зателефонувавши до його doLayout()методу, який, як правило, викликає LayoutManager. Тепер кожна дитина, поміщена в цей контейнер, буде перевірена рекурсивно, так що все дерево буде викладено і стане дійсним.

revalidate(): revalidate()викликається, коли ви змінюєте атрибут, який би вплинув на їх ширину / висоту, і виклику перефарбуйте (), коли ви зміните атрибут, який вплине на їх зовнішній вигляд. Наприклад, якщо ваш JFrameмістить a JPanel, тепер ви в певний момент часу ви видалили його JPanelі вставили на його місце новий, залежно від вмісту щойно розміщеного JPanel, розміру компонентів всередині JPanel, а також The CONTAINERсамого себе (в силу використовуваного ним менеджера компонування), змінюється. Що підштовхує його до недійсного стану. Отже, щоб підтвердити цю зміну, вам потрібно явно зателефонувати revalidate().

invalidate(): Це те, що я ніколи не використовував, тому може бути не так багато інформації, яку я можу надати про це. Але схоже, що сценарії, представлені вище, можуть дати трохи підказки щодо того, що відбувається під час використання invalidate().


1
Я вважаю invalidate(), що корисно, коли ви оновлюєте кілька компонентів і хочете позначити їх як недійсні, перш ніж остаточно перерахувати макет за допомогою revalidate()або validate().
Qix - МОНІКА ПОМИЛИЛА

1
@Qix: IMHO, немає потреби викликати недійсний (), оскільки він автоматично викликається. Більше того, сама перезавантажити () виконає це завдання (Як зазначено в Java Docs, він виступає зручним методом для виклику як invalidate ()і validate ()).
NIcE cOw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.