无法在JFrame中添加多个JPanel,

时间:2012-05-05 07:01:29

标签: 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);

    }
}

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

或切换到BoxLayout的其他布局管理器(例如FlowLayoutJFrame)。这取决于您的需求。看一下Visual guide to layout managers,这是选择经理的一个很好的起点。

答案 1 :(得分:6)

您应该使用不同的布局管理器,请查看:A Visual Guide to Layout Managers为您选择一个。

这对我来说很好,

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

            }
        });
    }
}