2

I'm using Swing and I am trying to add the same components to multiple panels. However, only the panel I add to the frame last has these buttons. I am adding the same set of labels/textfields to p2, p3, and p4. But since I added the labels/textfields to p4 last, it seems to show only p4 as having it. How can I re-use these components for multiple JPanels so I don't have to make a ton of them for each different panel?

The code I am using:

public class TriangleGUI extends JFrame implements ActionListener
{
    static JPanel p1, p2, p3,p4,p5;
    static JButton b1, b2, b3;
    static JLabel label1, label2, label3;
    static JTextField tf1, tf2, tf3;
    private static int side1, side2, side3, angle1, angle2, angle3; 
    public TriangleMadnessGUI(){
        setSize(800,400);
        p1 = new JPanel();
        p2 = new JPanel();
        p3 = new JPanel();
        p4 = new JPanel();

        b1 = new JButton("1 Side, 2 Angles"); //buttons
        b2 = new JButton("1 Angle, 2 Sides");
        b3 = new JButton("3 Sides");

        label1 = new JLabel("Angle 1");       //labels which i intend to reuse                                                 
        label2 = new JLabel("Angle 2");
        label3 = new JLabel("Side 1");

        tf1 = new JTextField("",5);           //textfields which i intend to reuse
        tf2 = new JTextField("",5);
        tf3 = new JTextField("",5);

        p1.add(b1);
        p1.add(b2);
        p1.add(b3);

        p2.add(label1);  //panel 2, add set of components
        p2.add(tf1);
        p2.add(label2);
        p2.add(tf2);
        p2.add(label3);
        p2.add(tf3);

        p3.add(label1);  //panel 3, adding set of same components
        p3.add(tf1);
        p3.add(label2);
        p3.add(tf2);
        p3.add(label3);
        p3.add(tf3);

        p4.add(label1);  //panel 4, adding set of same components
        p4.add(tf1);
        p4.add(label2);
        p4.add(tf2);
        p4.add(label3);
        p4.add(tf3);

        add(p1, BorderLayout.NORTH);
        add(p4, BorderLayout.CENTER);   // <-----HERE, only p4 has visible buttons
                                        // p2 and p3 are just blank if used in here.
        setVisible(true);
    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
TheEyesHaveIt
  • 980
  • 5
  • 16
  • 33

2 Answers2

7

However, only the panel I add to the frame last has these buttons. I am adding the same set of labels/textfields to p2, p3, and p4. But since I added the labels/textfields to p4 last, it seems to show only p4 as having it.

If any component c1 of panel1 gets added to another Container panel2, then it first removed from the old Container(panel1) and then gets added to panel2. Refer to the source code of Container class add(component) function.

add(p4, BorderLayout.CENTER);   // <-----HERE, only p4 has visible buttons
                                        // p2 and p3 are just blank if used in here.

Yes, when using layout we can't place two component in the same place. That doesn't make any sense. If p1, p2 and p3 contains same JComponent instances, there is no meaning to use it with multiple panel. However if you are thinking about Group of components with similar(not same) outlet and orientation, we can easily create our own version of component and orient other necessary component inside of it:

class MyPanel extends JPanel
{
   JTextFeild tf1;
   JLabel label1;
   JLabel label2;
   JTextFeild tf2;
   JLabel label3;

   public MyPanel(String lab1Val, String lab2Val, String lab3Val)
  {
    setLayout(myLayout);
    // create the component tf1, label1, label2, etc instances

    add(tf1);
    add(label2);
    add(tf2);
    add(label3);
    add(tf3);
  }

 @Override
  public Dimension getPreferredSize() {
 }
 }

Then we can create any number of MyPanel instances to work with suitable layout manager.

Sage
  • 15,290
  • 3
  • 33
  • 38
1

JFrame uses a BorderLayout by default.

BorderLayout will only show one component for each of it's five available slots. That means, only the last component added to any given spot will be visible.

Take a look at Laying Out Components Within a Container for more ideas

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366