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

111

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

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

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

mikera
источник

Ответы:

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();
        }
    }
}
StanislavL
источник
3
revalidate()не звонит doLayout(), а звонит validate(). Так что на самом деле это не сумма обоих - revalidateне всегда правильная замена validate.
Meo
То есть для AWT, вот как выглядит повторная валидация
Meo
В этом случае я думаю (никогда не пробовал) RepaintManager вызовет проверку
StanislavL
Я имел дело с уродливой ошибкой, и замена revalidate на validate (которая вызывает doLayout) решила ее ...
Meo
Как мы можем вызвать validate () из статического метода?
Кунал Тяги
69

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

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

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

NICE COW
источник
1
Я считаю, что invalidate()это полезно, когда вы обновляете несколько компонентов и хотите пометить их как недопустимые, прежде чем окончательно пересчитать макет с помощью revalidate()или validate().
Qix - МОНИКА БЫЛА ОФОРМЛЕНА
1
@Qix: IMHO, нет необходимости вызывать invalidate (), поскольку он вызывается автоматически. Более того, эту задачу будет выполнять сама revalidate () (как указано в документации Java, она действует как удобный метод для вызова invalidate ()и validate ()).
NICE COW