问题
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);
}
}
回答1:
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.
回答2:
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
来源:https://stackoverflow.com/questions/19697996/adding-the-same-components-to-multiple-panels