Вы можете использовать frame.remove()
Разница в том, что вы можете удалить целую панель вместо того, чтобы удалять "несколько" вещей, и просто заменить ее новой панелью
frame.add( mainPanel );
...
// in the action listener
frame.remove( mainPanel );
frame.add( theNewPage );
Дело в том, что вам не нужно бояться неуклюже убирать вещи из основной рамки, потому что вы должны поместить все эти вещи в одну панель, а затем просто менять панели.
UPDATE
Я создал код, необходимый для проверки того, о чем я говорю.
Вот пример работы:
альтернативный текст http://img190.imageshack.us/img190/5206/capturadepantalla200912p.png
позже
альтернативный текст http://img301.imageshack.us/img301/1368/capturadepantalla200912n.png
Вот пример работы:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ChangePage {
JComponent mainPage;
JComponent newPage;
JFrame frame;
public static void main( String [] args ) {
ChangePage changePageDemo = new ChangePage();
changePageDemo.show();
}
private void show(){
frame = new JFrame("Demo");
frame.add( getMainPage() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
private JComponent getMainPage() {
if( this.mainPage != null ) {
return this.mainPage;
}
this.mainPage = new JPanel(new BorderLayout());
mainPage.add( new JLabel("Choose an option") );
mainPage.add( new JPanel(){{
add( new JButton("New"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent e ){
SwingUtilities.invokeLater( new Runnable(){
public void run(){
frame.remove( getMainPage() );
frame.add( getNewPage() );
//frame.setContentPane( getNewPage() );
frame.pack();
}
});
}
});
}});
add( new JButton("Options"));
add( new JButton("Exit"));
}}, BorderLayout.SOUTH );
return this.mainPage;
}
private JComponent getNewPage() {
if( newPage != null ) {
return newPage;
}
this.newPage = new JPanel();
this.newPage.add( new JLabel("<html>This is the \"new\" page.<br> Do you like it?<br></html>"));
this.newPage.add( new JButton("Return"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent e ){
SwingUtilities.invokeLater( new Runnable(){
public void run(){
frame.remove( getNewPage() );
frame.add( getMainPage() );
//frame.setContentPane( getMainPage() );
frame.pack();
}
});
}
});
}});
return this.newPage;
}
}
В качестве альтернативы вы можете использовать setContentPane
:)