我有一个以下的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
.
添加第二个面板时会发生什么.为什么第一个面板没有显示在框架中?
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
.这取决于您的需求.看一下布局管理器的可视化指南,这是选择经理的一个很好的起点.
您应该使用不同的布局管理器,请查看:布局管理器的可视指南,为您选择一个.
这对我很好,
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)