Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java GUI, Change Panel according to actionListener

I have two buttons added in two different panels, if first button is clicked then it need to take to next panel with the second button in it. But the button was not replaced when I click first button.

/*Java GUI*/

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


public class TestFrame extends JFrame{

    private JPanel panel1, panel2;
    private JButton but,but2; 

    public TestFrame()
    {
        createPanel();
        addPanel();
    }

    private void createPanel()
    {
        panel1 = new JPanel();
        but = new JButton("TestButton");
        but.addActionListener(new addButtonListener());

        panel2 = new JPanel();
        but2 = new JButton("TestButton2");

    }

    private void addPanel()
    {
        panel1.add(but);
        panel2.add(but2);

        add(panel1);

    }

    class addButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent ae) 
        {
            getContentPane().removeAll();
            add(panel2);

            repaint();
        }
    }


    public static void main(String args[])
    {
        JFrame frame = new TestFrame();
        frame.setTitle("Test Software");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,500);

        frame.setVisible(true);
    }



}
like image 654
vijay Avatar asked Nov 26 '12 09:11

vijay


2 Answers

You need to do validation and then repaint.

validate();
repaint();
like image 56
Dan D. Avatar answered Oct 24 '22 00:10

Dan D.


After remowing all from contentPane, try add panel to ContentPane. Second thing is repainting. If you will not update panel content, it will be painted after resize. Here you are example solution:



    import java.awt.event.ActionEvent;

    import java.awt.event.ActionListener;

    import javax.swing.*;

    public class Frame extends JFrame{
        private JPanel panel1, panel2;
        private JButton but,but2; 
        public Frame()
        {
           createPanel();
           addPanel();
        }
        private void createPanel()
        {
            panel1 = new JPanel();
            but = new JButton("TestButton");
            but.addActionListener(new addButtonListener());
            but.setBounds(50, 90, 190, 30);//There are example values but remember about setting size
            panel2 = new JPanel();
            but2 = new JButton("TestButton2");
            but2.setBounds(50, 50, 90, 30);//There are example values but remember about setting size
        }
        private void addPanel()
        {
            panel1.add(but);
            panel2.add(but2);
            add(panel1);
        }

        class addButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae) 
            {
                getContentPane().removeAll();
                getContentPane().add(panel2);//Adding to content pane, not to Frame
                repaint();
                printAll(getGraphics());//Extort print all content
            }
        }

        public static void main(String args[])
        {
            Frame frame = new Frame();
            frame.setTitle("Test Software");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500,500);
            frame.setVisible(true);
        }

    }

Oracle docs explains difference beetwen adding to contentPane or to Frame directly.
http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

like image 4
Pingwin Tux Avatar answered Oct 23 '22 23:10

Pingwin Tux