我有一个以下的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
。
添加第二个面板时会发生什么。为什么第一个面板没有显示在框架中?
答案 0 :(得分:7)
JFrame
的默认布局是BorderLayout
。 BorderLayout
的一个特征是它只能在每个区域中包含一个组件。如果您只使用add
方法而未指定任何约束,则与将组件添加到CENTER
相同。因此,您的第二次add
调用会替换您首次添加的元素。
可能的解决方案:指定约束,例如
add(pnl_date, BorderLayout.NORTH);
//...
add(pnl_activities, BorderLayout.CENTER);
或切换到BoxLayout
的其他布局管理器(例如FlowLayout
或JFrame
)。这取决于您的需求。看一下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);
}
});
}
}