How to replace JPanel with another JPanel

前端 未结 6 1683
有刺的猬
有刺的猬 2021-01-05 10:46

I want to replace a Jpanel with another one in a JFrame I already search and try my code but nothing\'s happen this is my code :

public class Frame extends          


        
相关标签:
6条回答
  • 2021-01-05 11:10
    1. don't to use AbsoluteLayout

    2. change validate(); in actionPerformed to contain.validate(); and follows with contain.repaint();

    3. rename class name (reserved Java word, or methods name) Frame (java.awt.Frame) to MyFrame (for example)

    4. use CardLayout instead of remove and then add a new JPanel on runtime

    0 讨论(0)
  • 2021-01-05 11:15

    Several issues with your code. Here is fixed version:

    public class Frame extends JFrame {
    
        private Container contain;
        private JPanel reChange,reChange2;
        private JButton reChangeButton;
    
        public Frame() {
            super("Change a panel");
            setSize(350, 350);
            getContentPane().setLayout(null); // Changed here
            setLocationRelativeTo(null);
            setResizable(false);
    
            reChange = new JPanel(null);
            reChange.setBackground(Color.red);
            reChange.setSize(240, 225);
            reChange.setBounds(50, 50, 240, 225);
            getContentPane().add(reChange); // Changed here
    
            reChangeButton = new JButton("Change It");
            reChangeButton.setBounds(20, 20, 100, 20);
            getContentPane().add(reChangeButton); // Changed here
    
            reChangeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    contain = getContentPane();
                    contain.removeAll();
    
                    reChange2 = new JPanel(null);
                    reChange2.setBackground(Color.white);
                    reChange2.setSize(240, 225);
                    reChange2.setBounds(50, 50, 240, 225);
    
                    contain.add(reChange2);
                    invalidate(); // Changed here
                    repaint(); // Changed here
                }
            });
        }
    
        public static void main(String[] args) {
            Frame frame = new Frame();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    
    0 讨论(0)
  • 2021-01-05 11:20

    you need to do like this :

         public void actionPerformed(ActionEvent e) {
            //System.out.println("in");
            contain = getContentPane();
            contain.removeAll();
            //System.out.println("in2");
    
            reChange2 = new JPanel(null);
            reChange2.setBackground(Color.white);
            reChange2.setSize(240, 225);
            reChange2.setBounds(50, 50, 240, 225);
            //System.out.println("in3");
    
            contain.add(reChange2);
            validate();
            repaint();
            //System.out.println("in4");
            setVisible(true);
            //System.out.println("in5");
        }
    });
    
    0 讨论(0)
  • 2021-01-05 11:26

    Assume you have a function, generatePanel() that returns a JPanel that you save in an instance variable of type JPanel:

    private JPanel panelWithDynamicContent;
    

    Assume you have already placed that JPanel into a container, perhaps at a specific index within that other container and want to preserve the order of the components within that container. Instead of destroying everything using removeAll(), I prefer a more precise approach that replaces only the component that needs to be replaced:

    private void replacePanel(){
       Container parent = this.panelWithDynamicContent.getParent();
       int index = parent.getComponentZOrder(this.panelWithDynamicContent);
       // remove the old edition of the panel
       parent.remove(this.panelWithDynamicContent);
       // generate the replacement panel
       this.panelWithDynamicContent = generatePanel();
       // place the replacement panel in the same relative location as the one it is replacing
       parent.add(this.panelWithDynamicContent, index);
    
       // must call both of these, in the correct order
       parent.validate();
       parent.repaint();
    }
    
    0 讨论(0)
  • 2021-01-05 11:27

    Try this, Following code will load the second jPanel (NewOrder) to first jPanel(jpMain)

    NewOrder no = new NewOrder(); //This is the object of Second JPanel
    
    // jpMain - This is the First JPanel
    jpMain.setLayout(new java.awt.BorderLayout());
    jpMain.removeAll();
    jpMain.add(no);
    jpMain.revalidate();
    
    0 讨论(0)
  • 2021-01-05 11:28

    You must call validate() and then repaint() on the containing panel after you do the remove and add operations.

    contain.validate();
    contain.repaint();
    
    0 讨论(0)
提交回复
热议问题