Разница между validate (), revalidate () и invalidate () в Swing GUI
компоненты Swing имеют несколько методов, связанных с обновление макета экрана, в частности:
документация Java определяет их несколько с технической точки зрения, но не особенно ясно, как они предназначены для использования.
в чем разница между ними, и в каких обстоятельствах вы должны использовать один, а не другие?
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()
.