Разница между validate(), revalidate() и invalidate() в графическом интерфейсе Swing

Компоненты Swing имеют несколько методов, связанных с обновлением макета экрана, в частности:

Документация по Java определяет их с технической точки зрения, но не совсем ясно, как они предназначены для использования.

В чем разница между ними и в каких обстоятельствах вы должны использовать один, а не другие?

Ответ 1

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 no parents. Just validate itself.
            validate();
        } else {
            while (!root.isValidateRoot()) {
                if (root.getContainer() == null) {
                    // If there no validate roots, we'll validate the
                    // topmost container
                    break;
                }

                root = root.getContainer();
            }

            root.validate();
        }
    }
}

Ответ 2

validate(): В Swing при создании компонента он valid т.е. его действительное свойство имеет значение false. Компонент считается действительным, когда определена его ширина, высота, местоположение и прочее. Обычно это делается путем прямого или косвенного вызова метода validate(). Когда мы вызываем validate() в контейнерах, он проверяет контейнер (если он недействителен), вызывая его doLayout(), который обычно вызывается LayoutManager. Теперь каждый ребенок, помещенный в этот контейнер, будет рекурсивно проверен, так что все дерево будет выложено и станет действительным.

revalidate(): revalidate() вызывается при изменении атрибута, который влияет на их ширину/высоту и переадресацию вызовов() при изменении атрибута, который повлияет на их внешний вид. Например, если ваш JFrame содержит JPanel, теперь через определенный промежуток времени вы удалили JPanel и вставили новый на свое место, в зависимости от содержимого вновь созданного JPanel, размер компонентов внутри JPanel также как сам The CONTAINER (в силу используемого им менеджера компоновки). Это подталкивает его к недопустимому состоянию. Поэтому, чтобы проверить это изменение, вы должны явно вызвать revalidate().

invalidate(): Это то, что я никогда не использовал, поэтому может быть не так много информации, которую я могу предоставить. Но похоже, что приведенные выше сценарии могут дать немного подсказки, что происходит при использовании invalidate().