Разница между validate (), revalidate () и invalidate () в Swing GUI


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

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

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

2 101

2 ответа:

invalidate() помечает контейнер недействительным. Означает, что содержание как-то неправильно и должно быть повторно выложено. Но это просто своего рода знак/флаг. Возможно, что несколько недопустимых контейнеров должны быть обновлены позже.

validate() выполняет разделов. Это означает, что недопустимое содержимое запрашивается для всех размеров, и все размеры подкомпонентов устанавливаются в правильные значения LayoutManager.

revalidate() - это просто сумма обоих. Он помечает контейнер как недопустимый и выполняет макет контейнер.

обновление:

некоторый код из компонента.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();
        }
    }
}

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

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

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