无法在JFrame中添加多个JPanel,

Ank*_*kit 2 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 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);

    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建这个框架时,我期待它会创建一个带有两个面板的框架.但是,我只看到第二个面板(即)我只Y在屏幕上看到而不是X.但是,如果我删除第二个面板的代码,那么我可以看到X.

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

Rob*_*bin 7

a的默认布局JFrame是a BorderLayout.其特征BorderLayout在于它在每个区域中只能包含一个组件.如果您只使用该add方法而未指定任何约束,则与将组件添加到该方法相同CENTER.因此,您的第二个add调用将替换您首次添加的元素.

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

add(pnl_date, BorderLayout.NORTH);
//...
add(pnl_activities, BorderLayout.CENTER);
Run Code Online (Sandbox Code Playgroud)

或切换到另一个布局管理器(例如a BoxLayout或a FlowLayout)JFrame.这取决于您的需求.看一下布局管理器可视化指南,这是选择经理的一个很好的起点.


COD*_*BOY 6

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

这对我很好,

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

            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)