2

我有一个以下 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.

当我添加第二个面板时会发生什么。为什么第一个面板没有出现在框架中?

4

2 回答 2

7

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

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

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

BoxLayoutFlowLayout您的JFrame. 这取决于您的需求。查看布局管理器的可视化指南,这是选择管理器的一个很好的起点。

于 2012-05-05T07:09:26.143 回答
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);

            }
        });
    }
}
于 2012-05-05T07:17:06.337 回答