【问题标题】:Adding the same components to multiple panels? [duplicate]将相同的组件添加到多个面板? [复制]
【发布时间】:2013-10-31 03:32:53
【问题描述】:

我正在使用 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);
    }
}

【问题讨论】:

    标签: java swing layout jframe jpanel


    【解决方案1】:

    但是,只有我最后添加到框架的面板有这些按钮。一世 我正在向 p2、p3 和 p4 添加相同的标签/文本字段集。但 因为我最后将标签/文本字段添加到 p4,所以它似乎只显示 p4 拥有它。

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

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

    是的,当使用布局时,我们不能将两个组件放在同一个地方。这没有任何意义。如果p1p2p3 包含相同的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

    【讨论】:

    • 我希望空的 getPreferredSize 来自 OP 的代码 ;)
    • 是的,在我把任何东西放进去之前他需要问一下,虽然我应该添加评论:)
    • 我会为此声明 +1!
    【解决方案2】:

    JFrame 默认使用BorderLayout

    BorderLayout 将只为它的五个可用插槽中的每一个显示一个组件。这意味着,只有添加到任何给定位置的最后一个组件是可见的。

    查看Laying Out Components Within a Container 了解更多想法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多