Difference between validate(), revalidate() and invalidate() in Swing GUI

JavaSwingUser Interface

Java Problem Overview


Swing components have multiple methods related to updates of screen layout, in particular:

The Java documentation defines these somewhat from a technical perspective, but it's not particularly clear how they are meant to be used.

What is the difference between these, and in what circumstances should you use one rather than the others?

Java Solutions


Solution 1 - Java

invalidate() marks the container as invalid. Means the content is somehow wrong and must be re-laid out. But it's just a kind of mark/flag. It's possible that multiple invalid containers must be refreshed later.

validate() performs relayout. It means invalid content is asked for all the sizes and all the subcomponents' sizes are set to proper values by LayoutManager.

revalidate() is just sum of both. It marks the container as invalid and performs layout of the container.

UPDATE:

Some code from 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();
        }
    }
}

Solution 2 - Java

validate() : In Swing when you create a Component, it is not valid i.e. its valid property is false. A component is said to be valid, when its width, height, location and stuff has been determined. This is usually done by calling their validate() method, directly or indirectly. When we call validate() on containers, it will validate the container (if it is invalid) by calling its doLayout() method, which typically will invoke the LayoutManager. Now each child placed on this container will be validated recursively, so that the entire tree will be laid out and will become valid.

revalidate() : revalidate() is to be called when you change an attribute that would affect their width/height and call repaint() when you change an attribute that would affect their appearance. For example, if your JFrame contains a JPanel, now at a certain point of time you removed that JPanel and inserted a new one in its place, depending on the contents of the newly placed JPanel, the size of the components inside the JPanel as well as The CONTAINER itself (by virtue of the layout manager used by it), changes. Which pushes it to the invalid state. So in order to validate this change, you have to explicitly call revalidate().

invalidate() : This is something I have never used, so there might not be much info I can provide about it. But it seems like the scenarios presented above can give a bit of a hint, as to what happens when using invalidate().

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmikeraView Question on Stackoverflow
Solution 1 - JavaStanislavLView Answer on Stackoverflow
Solution 2 - JavanIcE cOwView Answer on Stackoverflow