Switch between JPanels of different classes

*爱你&永不变心* 提交于 2020-01-05 09:33:58

问题


How do I switch between JPanels of different classes? I do not wish to use a Card Layout.

I have 2 classes - MainPage & MenuPage. For instance, I would like to clear the contentPane (a JPanel) @ MainPage and replace it with the content pane @ MenuPage. For testing purposes, I included a button @ MenuPage.

Please see my following attempt - it gives an error:

java.lang.IllegalArgumentException: adding a window to a container

MainPage

public class MainPage extends JFrame {

    private static JPanel contentPane;
    private JLabel imgBackground;
    private JLabel lblTitle;
    private JLabel imgLogo;
    private Dimension dim;

    //timer
    private final static int interval = 40;
    private int i;
    private Timer t;
    //private JButton start;
    //private JLabel lblLoading;
    private JProgressBar pbar;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainPage frame = new MainPage();                    
                    frame.setVisible(true);             
                } 
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });     
    }

    public MainPage() {             
        dim = Toolkit.getDefaultToolkit().getScreenSize();      
        System.out.println(dim);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        contentPane.setBounds(0,0,dim.width,dim.height);
        setContentPane(contentPane);

        this.setExtendedState(JFrame.MAXIMIZED_BOTH);       

        t = new Timer (interval, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (i == 20){
                    t.stop();
                    //start.setEnabled(true);   


                    //refresh + load next page ???              
                    contentPane.removeAll();
                    MenuPage loadpanel2 = new MenuPage();
                    setContentPane(loadpanel2);


                    revalidate();                   
                    repaint();
                }
                else{
                    i++;
                    pbar.setValue(i);
                }               
            }           
        });
        t.start();

MenuPage

public class MenuPage extends JFrame {

    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MenuPage frame = new MenuPage();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public MenuPage() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        setContentPane(contentPane);

        JButton btnSadfsafsa = new JButton("sadfsafsa");
        btnSadfsafsa.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        btnSadfsafsa.setBounds(10, 52, 89, 23);
        btnSadfsafsa.setEnabled(true);
        btnSadfsafsa.setVisible(true);
        contentPane.add(btnSadfsafsa);
    }
}

回答1:


java.lang.IllegalArgumentException: adding a window to a container

That is pretty straightforward. Both GUIs extend JFrame and are therefore top level containers. We cannot add one top level container to another.

Instead of extending frame, both GUIs might extend JPanel. A JPanel (or more than one) can then be added to a JFrame instantiated in the main(String[]) or a showGUI() method.



来源:https://stackoverflow.com/questions/27831067/switch-between-jpanels-of-different-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!