slex
slex

Reputation: 855

java validate() method doesnt work properly

I have a JFrame inside of which is a jpanel that im using as the content pane.

So basically im using the jpanel to load content into on click. New content is returned as a Jpanel also so its ends up being jpanel -> inside jpanel -> inside Jframe. When i need to load in new content i clear the panel, load the new content and validate() the jframe & jpanel and the new content displays.

My problem is that when the new content displays its clear that the validate method is working because i can see the new interface but i can also see the old interface as if its become the background; i can resize the window and it just disappears and looks as it should.

enter image description here enter image description here

Is this just the way validate works or can i fix it?

Edit: this worked. The problem was i wasn't calling repaint manually.

public BaseWindow setContent(JComponent comp){
    contentPane.add(comp);
    contentPane.revalidate();
    contentPane.repaint();
    return this;
}

Upvotes: 3

Views: 7129

Answers (6)

James L.
James L.

Reputation: 14545

I ended up fixing my issue (display not shown, buttons would stay clicked/weren't unclicking) by changing which panels were added/removed.

Problem:

frame.removeAll();
frame.add(getNewPanelDisplay());
frame.revalidate();
frame.repaint();

Solution:

//initializer()
mainPanel = new JPanel();
frame.add(mainPanel());
// ...
//update()
mainPanel.remove(0);
mainPanel.add(getTablePanel(), 0);
frame.revalidate();
frame.repaint();

Upvotes: 0

Xanatos
Xanatos

Reputation: 1636

Here's another possible solution:

Put both JPanels in at the same time, side by side, and then make sure only one of them is ever visible at any one time:

JPanel p = new JPanel(new BorderLayout());
p.add( panelA, BorderLayout.EAST );
p.add( panelB, BroderLayout.WEST );
panelA.setVisible(true);
panelB.setVisible(false);

Then when the user clicks the button to switch panels:

panelA.setVisible(false);
panelB.setVisible(true);

The setVisible() method and BorderLayout should take care of validating, layout, and calls to repaint() for you.

Upvotes: 0

camickr
camickr

Reputation: 324207

Generally the code for adding/removing one or two components from a panel is:

panel.remove(..);
panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed

However, if you are replacing all the components on the panel, then the better approach is to use a Card Layout.

You have already stated the revaliate() followed by repaint() doesn't work so the only suggestion I have is to post your SSCCE that demonstrates the problem.

Upvotes: 4

Suraj Chandran
Suraj Chandran

Reputation: 24801

Don't use validate. Use revalidate() instead.

Revalidate first calls invalidate() followed by a validate(). In Swing, you would rarely use validate().

Note: I also feel that maybe the old panel is not cleared/removed.Check again!

Upvotes: 2

Xanatos
Xanatos

Reputation: 1636

Validate() is for causing components to re arrange themselves according to the layoutmanager that you have installed. This is not really what you should be using.

I can't see your code, so I'm not sure exactly what you are doing. I could speculate that calling repaint() on your "inner panel" will solve the problem you are having...but really, if you are doing things properly, you shouldn't need to call repaint() or validate().

Make two JPanels, one with content A (e.g. your buttons), and one with content B (e.g. your "static" field). Use the "add()" and "remove()" methods on the parent container (the JFrame's content pane?) to swap these two JPanels with each other whenever you want to switch the content that is displayed in that part of the JFrame.

Then you shouldn't need to do anything else; it should just work.

Upvotes: 1

perp
perp

Reputation: 3963

I don't know if validate() makes any promise about fully repainting the container. You might have to call repaint() yourself to make it behave as you want to.

Upvotes: 0

Related Questions