我正在使用Swing,我正在尝试将相同的组件添加到多个面板中。但是,只有我最后添加到帧中的面板才有这些按钮。我正在为p2,p3和p4添加同一组标签/文本字段。但是因为我最后将标签/文本字段添加到p4,所以它似乎只显示了p4。如何为多个JPanel重复使用这些组件,以便我不必为每个不同的面板制作大量的组件?
我正在使用的代码:
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);
}
}
答案 0 :(得分:6)
但是,只有我最后添加到框架的面板才有这些按钮。一世 我将同一组标签/文本字段添加到p2,p3和p4。但 因为我最后将标签/文本字段添加到p4,所以它似乎只显示 p4有它。
如果c1
的任何组件panel1
被添加到另一个Container
panel2
,那么它首先会从旧容器(panel1
)中删除,然后获取已添加到panel2
。请参阅Container
类add(component)
函数的源代码。
add(p4, BorderLayout.CENTER); // <-----HERE, only p4 has visible buttons
// p2 and p3 are just blank if used in here.
是的,在使用布局时,我们无法将两个组件放在同一个位置。这没有任何意义。如果p1
,p2
和p3
包含相同的JComponent
个实例,则无法将其与多个面板一起使用。但是,如果您正在考虑具有相似(不相同)出口和方向的组件组,我们可以轻松创建自己的组件版本并在其中定位其他必要组件:
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() {
}
}
然后,我们可以创建任意数量的MyPanel
个实例,以使用合适的layout manager。
答案 1 :(得分:1)
JFrame
默认使用BorderLayout
。
BorderLayout
只会为其五个可用插槽中的每一个显示一个组件。这意味着,只有添加到任何给定点的最后一个组件才会可见。