是否将相同的组件添加到多个面板? [英] Adding the same components to multiple panels?

查看:95
本文介绍了是否将相同的组件添加到多个面板?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Swing,并且试图将相同的组件添加到多个面板中.但是,只有我最后添加到框架中的面板具有这些按钮.我将同一组标签/文本字段添加到p2,p3和p4.但是,由于我最后在p4中添加了标签/文本字段,因此似乎仅显示p4具有它.我如何才能将这些组件用于多个JPanel,这样我就不必为每个不同的面板制作大量的组件?

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?

我正在使用的代码:

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);
    }
}

推荐答案

但是,只有我最后添加到框架中的面板具有这些按钮.一世 正在将相同的标签/文本字段集添加到p2,p3和p4.但 由于我最后在p4中添加了标签/文本字段,因此似乎只显示了 p4拥有它.

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.

如果panel1的任何组件c1被添加到另一个Container panel2,则它首先从旧Container(panel1)中删除,然后被添加到panel2.请参考Containeradd(component)函数的源代码.

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.

是的,在使用布局时,我们不能将两个组件放置在同一位置.那没有任何意义.如果p1p2p3包含相同的JComponent实例,则没有意义将其用于多个面板.但是,如果您要考虑具有相似(不同)出口和方向的组件组,我们可以轻松创建自己的组件版本并在其中定位其他必要的组件:

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() {
 }
 }

然后,我们可以创建任意数量的MyPanel实例,以与合适的布局经理.

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

这篇关于是否将相同的组件添加到多个面板?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆