Re: How to change JPanels?
On Feb 9, 11:10 am, Ian Shef <inva...@avoiding.spam> wrote:
Eric <e.d.program...@gmail.com> wrote in news:3ace5bbb-ab88-4d11-af96-
cfeece509...@k9g2000yqi.googlegroups.com:
I created an object which extends JFrame.
I added a JPanel object to it. I can see that panel just fine.
I remove that object and add a custom object of a class which extends
JPanel. I can see that just fine.
I try to remove that object to add the first panel back on and I still
see it.
I tried the getComponents method on the JFrame object and it returns
one object of type JRootPane.
I tried the getContentPane method and got a Container, then tried
getComponents on that object. It contains my custom panel. I trie=
d a
remove method on that object and I still see the panel! I tried
setContentPane on that object after the remove, I tried adding a
repaint on the ContentPane object, I'm repainting the JFrame object,
nothing is removing this panel!
The problem is in your code. :-)
Please provide the code and perhaps we can be more specific.
Even better would be a SSCCE (see http://sscce.org/ ).
Perhaps you didn't follow the instructions in the Javadocs:
Note: If a component has been removed from a container that had been =
displayed, validate() must be called on that container to reflect cha=
nges.
If multiple components are being removed, you can improve efficiency =
by
calling validate() only once, after all the components have been remo=
ved.
What did getComponents reveal AFTER you executed the remove ?
Ok, it seems the actual problem is that gui commands will not redraw a
gui screen while the program is running a listener action event.
I wrote the class as SSCCE. You can paste this directly into a new
class and see it run. Hopefully it's not too lengthy.
The listener action shows panel 2 then does processing which takes
some time then shows panel 1. If you comment out the last statement
which puts panel 1 back you can see it switch to panel 2. I just
can't get it to display panel 2 while it's doing the processing.
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
public class TestWindow {
InnerTestWindow win = null;
protected class InnerTestWindow extends JFrame {
protected CardLayout cardLayout = null;
protected Container contentPane = null;
protected JPanel panelOne = null;
protected JPanel panelTwo = null;
private JTextArea dummyTextOne = null;
private JTextArea dummyTextTwo = null;
protected InnerTestWindow() {
contentPane = getContentPane();
contentPane.setLayout(new CardLayout());
cardLayout = (CardLayout)contentPane.getLayout();
MenuBar menuBar = new MenuBar();
Menu menu = new Menu("Test");
addMenuItem(menu,"First","FirstItem",new
FirstItemListener());
menuBar.add(menu);
setMenuBar(menuBar);
setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
setSize(600, 600);
setLocation(100, 100);
panelOne = new JPanel();
contentPane.add(panelOne,"Panel One");
dummyTextOne = new JTextArea("Panel One");
panelOne.add(dummyTextOne);
panelTwo = new JPanel();
contentPane.add(panelTwo,"Panel Two");
dummyTextTwo = new JTextArea("Panel Two");
panelTwo.add(dummyTextTwo);
setContentPane(contentPane);
loadOne();
}
private void addMenuItem(Menu menu, String menuItemTitle, String
menuItemName, ActionListener menuListener) {
MenuItem menuItem = new MenuItem(menuItemTitle);
menuItem.setActionCommand(menuItemName);
menuItem.addActionListener(menuListener);
menu.add(menuItem);
}
private class FirstItemListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
loadTwo();
long t0, t1;
t0 = System.currentTimeMillis();
do {
t1 = System.currentTimeMillis();
} while ((t1 - t0) < (3000));
loadOne();
}
}
protected void loadOne() {
cardLayout.show(contentPane, "Panel One");
repaint();
}
public void loadTwo() {
cardLayout.show(contentPane, "Panel Two");
repaint();
}
}
public void createWindow() {
win = new InnerTestWindow();
win.setVisible(true);
}
public static void main(String[] args) throws Exception {
TestWindow testWin = new TestWindow();
testWin.createWindow();
}