frame 2 inside frame 1

天大地大妈咪最大 提交于 2020-01-11 07:43:08

问题


I have 2 classes; Students and RegisterStudents, and hence 2 different main_panel(Class 1) and panel_1 (Class 2). What I am trying to do is, when a button on the Students Interface is pressed, the whole panel_1 should appear within main_panel. I have set both to same size already. is that possible?

The code i got so far is:

JButton btnNewButton = new JButton("Register Student");
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {


Students main_panel = new Students();
RegisterStudent panel_1 = new RegisterStudent();
main_panel.add(panel_1);


}
});
btnNewButton.setBounds(0, 162, 167, 37);
panel.add(btnNewButton);

This isnt doing anything though? its compiling, but panel_1 is not actually appearing inside the main_panel. Has anyone got any suggestions?


回答1:


JButton btnNewButton = new JButton("Register Student");
btnNewButton.addMouseListener(new MouseAdapter() {
   @Override
   public void mouseClicked(MouseEvent arg0) {


       Students main_panel = new Students();
       RegisterStudent panel_1 = new RegisterStudent();
       main_panel.add(panel_1);
       panel.add(main_panel); // ADD THIS LINE
   }
});
btnNewButton.setBounds(0, 162, 167, 37);
panel.add(btnNewButton);

You were initializing the new main_panel, and new panel_1, and adding panel_1 to main_panel but then you weren't doing anything with the new main_panel.

Also, I highly suggest naming your variables otherwise - these names are very non-intuitive.




回答2:


For such things I would suggest you to use CardLayout When you add something to the container, you must call revalidate() and repaint() methods to realize the changes made to it at RunTime. Like in your case you adding main_panel.add(panel_1);now after this you must perform

main_panel.revalidate();
main_panel.repaint();
frame.getRootPane().revalidate(); // for Upto JDK 1.6.
frame.revalidate();  // for JDK 1.7+
frame.repaint();

so that changes can be seen. A small code snippet to help you understand what I mean.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MultiplePanels extends JFrame
{
    private JPanel registrationPanel, loginPanel, searchPanel;

    private JButton registerButton, loginButton, searchButton;  

    private ActionListener action;

    public MultiplePanels()
    {       
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);            

        registrationPanel = new JPanel();
        registrationPanel.setBackground(Color.WHITE);

        loginPanel = new JPanel();
        loginPanel.setBackground(Color.YELLOW);

        searchPanel = new JPanel();
        searchPanel.setBackground(Color.BLUE);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(0, 1));
        buttonPanel.setBackground(Color.DARK_GRAY);

        registerButton = new JButton("REGISTER");       
        loginButton = new JButton("LOGIN");     
        searchButton = new JButton("SEARCH");

        buttonPanel.add(registerButton);
        buttonPanel.add(loginButton);
        buttonPanel.add(searchButton);

        action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                JButton button = (JButton) ae.getSource();

                if (button == registerButton)
                {
                    if (!(loginPanel.isShowing()) && !(searchPanel.isShowing()))
                    {
                        add(registrationPanel, BorderLayout.CENTER);
                    }
                    else 
                    {
                        if (loginPanel.isShowing())
                        {
                            remove(loginPanel);
                            add(registrationPanel, BorderLayout.CENTER);
                        }
                        else if (searchPanel.isShowing())
                        {
                            remove(searchPanel);
                            add(registrationPanel, BorderLayout.CENTER);
                        }
                    }
                }
                else if (button == loginButton)
                {
                    if (!(registrationPanel.isShowing()) && !(searchPanel.isShowing()))
                    {
                        add(loginPanel, BorderLayout.CENTER);
                    }
                    else 
                    {
                        if (registrationPanel.isShowing())
                        {
                            remove(registrationPanel);
                            add(loginPanel, BorderLayout.CENTER);
                        }
                        else if (searchPanel.isShowing())
                        {
                            remove(searchPanel);
                            add(loginPanel, BorderLayout.CENTER);
                        }
                    }
                }
                else if (button == searchButton)
                {
                    if (!(loginPanel.isShowing()) && !(registrationPanel.isShowing()))
                    {
                        add(searchPanel, BorderLayout.CENTER);
                    }
                    else 
                    {
                        if (loginPanel.isShowing())
                        {
                            remove(loginPanel);
                            add(searchPanel, BorderLayout.CENTER);
                        }
                        else if (registrationPanel.isShowing())
                        {
                            remove(registrationPanel);
                            add(searchPanel, BorderLayout.CENTER);
                        }
                    }
                }
                // This is what we are doing here to realize the changes
                // made to the GUI.
                revalidate();
                repaint();
            }
        };

        registerButton.addActionListener(action);
        loginButton.addActionListener(action);
        searchButton.addActionListener(action);

        add(buttonPanel, BorderLayout.LINE_START);
        setSize(300, 300);
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new MultiplePanels();
            }
        });
    }
}


来源:https://stackoverflow.com/questions/9322535/frame-2-inside-frame-1

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