invalidate()помечает контейнер как недопустимый. Означает, что содержание каким-то образом неверно и его необходимо заново выложить. Но это просто своего рода знак / флаг. Возможно, позже потребуется обновить несколько недопустимых контейнеров.
validate()выполняет ретрансляцию. Это означает, что запрашивается недопустимый контент для всех размеров, и LayoutManager устанавливает правильные значения для размеров всех подкомпонентов.
revalidate()это просто сумма обоих. Он отмечает контейнер как недопустимый и выполняет компоновку контейнера.
ОБНОВИТЬ:
Некоторый код из Component.java
publicvoid revalidate(){
revalidateSynchronously();}/**
* Revalidates the component synchronously.
*/finalvoid 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 containerbreak;}
root = root.getContainer();}
root.validate();}}}
В этом случае я думаю (никогда не пробовал) 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().
Я считаю, что invalidate()это полезно, когда вы обновляете несколько компонентов и хотите пометить их как недопустимые, прежде чем окончательно пересчитать макет с помощью revalidate()или validate().
Qix - МОНИКА БЫЛА ОФОРМЛЕНА
1
@Qix: IMHO, нет необходимости вызывать invalidate (), поскольку он вызывается автоматически. Более того, эту задачу будет выполнять сама revalidate () (как указано в документации Java, она действует как удобный метод для вызова invalidate ()и validate ()).
revalidate()
не звонитdoLayout()
, а звонитvalidate()
. Так что на самом деле это не сумма обоих -revalidate
не всегда правильная заменаvalidate
.validate()
: В Swing, когда вы создаете Компонент, это неvalid
то, что его действительное свойствоfalse
. Компонент считается действительным, если определены его ширина, высота, расположение и прочее. Обычно это делается путемvalidate()
прямого или косвенного вызова их метода. Когда мы вызываемvalidate()
контейнеры, он проверяет контейнер (если он недействителен), вызывая егоdoLayout()
метод, который обычно вызываетLayoutManager
. Теперь каждый дочерний элемент, помещенный в этот контейнер, будет проверяться рекурсивно, так что все дерево будет выложено и станет действительным.revalidate()
:revalidate()
должен вызываться, когда вы изменяете атрибут, который может повлиять на их ширину / высоту, и вызывать repaint (), когда вы меняете атрибут, который может повлиять на их внешний вид. Например, если вашJFrame
содержит aJPanel
, теперь в определенный момент вы удалили егоJPanel
и вставили на его место новый, в зависимости от содержимого вновь размещенногоJPanel
, размера компонентов внутри,JPanel
а такжеThe CONTAINER
самого себя (в силу используемого им менеджера по расположению), изменяется. Что переводит его в недопустимое состояние. Итак, чтобы подтвердить это изменение, вы должны явно вызватьrevalidate()
.invalidate()
: Это то, чем я никогда не пользовался, поэтому я могу немного рассказать об этом. Но похоже, что представленные выше сценарии могут дать небольшой намек на то, что происходит при использованииinvalidate()
.источник
invalidate()
это полезно, когда вы обновляете несколько компонентов и хотите пометить их как недопустимые, прежде чем окончательно пересчитать макет с помощьюrevalidate()
илиvalidate()
.invalidate ()
иvalidate ()
).