Java 无法在JFrame中添加多个JPanel,

Java 无法在JFrame中添加多个JPanel,,java,swing,jpanel,Java,Swing,Jpanel,我有一个下面的JFrame public class AddActivityWindow extends JFrame { //declaration of components go here ... public AddActivityWindow(ActivityStore store) { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pnl_date = new

我有一个下面的JFrame

public class AddActivityWindow extends JFrame {

    //declaration of components go here
     ...
    public AddActivityWindow(ActivityStore store) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel pnl_date = new JPanel();
        JLabel lbl_date = new JLabel("X");
        pnl_date.add(lbl_date);
        add(pnl_date);


        pnl_activities = new JPanel();
        JLabel lbl_act = new JLabel("Y");
        pnl_activities.add(lbl_act);
        add(pnl_activities);

        setLocationRelativeTo(null);
        setVisible(true);

    }
}
当我创建这个框架时,我希望它会创建一个包含两个面板的框架。但是,我只看到第二个面板(即),我只看到屏幕上的
Y
,而不是
X
。但是,如果删除第二个面板的代码,则可以看到
X


添加第二个面板时会发生什么。为什么第一个面板没有显示在框架中?

JFrame的默认布局是
边框布局。
BorderLayout
的一个特点是每个区域只能包含一个组件。如果只使用
add
方法而不指定任何约束,则与将组件添加到
中心
相同。因此,您的第二个
add
调用将替换您第一次添加的元素

可能的解决方案:指定约束,例如

add(pnl_date, BorderLayout.NORTH);
//...
add(pnl_activities, BorderLayout.CENTER);

或者为您的
JFrame
切换到另一个布局管理器(例如
BoxLayout
FlowLayout
)。这取决于你的需要。请查看,这是选择管理器的良好起点。

您应该使用不同的布局管理器,请查看:为您选择一个

这对我来说很好

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FrameTest extends JFrame {

    public FrameTest() {
        setLayout(new FlowLayout());
        setSize(150, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel pnl_date = new JPanel();
        JLabel lbl_date = new JLabel("X");
        pnl_date.add(lbl_date);
        add(pnl_date);


        JPanel pnl_activities = new JPanel();
        JLabel lbl_act = new JLabel("Y");
        pnl_activities.add(lbl_act);
        add(pnl_activities);

        setLocationRelativeTo(null);
        setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new FrameTest().setVisible(true);

            }
        });
    }
}

在将面板添加到JFrame之前,在JFrame上使用一些
布局
,否则它们肯定会相互重叠。。