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

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

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

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

Ответы [ 2 ]

64 голосов
/ 01 марта 2012

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

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

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

62 голосов
/ 01 марта 2012

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

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

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

UPDATE:

Некоторый код из 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...