java - 将相同的组件添加到多个面板?

标签 java swing layout jframe jpanel

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

最佳答案

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,那么它首先会从旧容器(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

关于java - 将相同的组件添加到多个面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697996/

相关文章:

java - 从 jFileChooser 组件创建文件

java - JMenuItem仅由键盘输入触发,而不是点击

android - 如何以编程方式更改布局的可见性

java - Hibernate 仅更新选定的列而不是所有修改的字段

java - Tomcat 可能发送我无法处理的 GET 请求

java.sql.SQLException : No data found

html - 在图像上叠加链接,允许调整图像大小

java - 检查数组中的整数是否在范围内

java - 当子类对象传递给带有父类(super class)参数的方法时会发生什么?

html - 如何更改 <div> 中同一行的样式