刚学 Swing,往窗口里放了三个按钮,窗口一拉大,按钮全挤在顶上一条。不是代码写错了,是 JFrame 默认用 BorderLayout,选 swing布局 之前先搞清这个默认值。
先认清两个默认布局
JFrame 的内容面板默认是 BorderLayout,分东南西北中五个位置,同一个位置后加的会盖掉先加的。JPanel 默认是 FlowLayout,控件从左往右排,排满一行自动换行,默认居中。
常用布局各自适合什么界面
- BorderLayout:主窗口骨架,工具栏放 NORTH,状态栏放 SOUTH,内容放 CENTER。
- FlowLayout:一排按钮、标签,宽度不够自动换行。
- GridLayout:等宽等高的网格,计算器键盘、九宫格很合适。
- BoxLayout:单行或单列排列,配合 Box.createHorizontalStrut 加间距。
- GridBagLayout:复杂表单,用 gridx、gridy、weightx 控制位置和拉伸。
代码里怎么指定
给容器设布局有两种写法:构造时传进去,或者调 setLayout。比如 JPanel panel = new JPanel(new GridLayout(2, 2, 8, 8)); 四个参数分别是行数、列数、水平间距、垂直间距。
frame.setLayout(new BorderLayout());frame.add(btn, BorderLayout.NORTH);GridBagLayout 的代码长,一般配 GridBagConstraints 用,先把 gridx 和 gridy 设好,再调 insets 留白,不然控件会贴在一起。
嵌套面板比硬算坐标靠谱
实际项目很少一个布局打天下。常见做法是外层 BorderLayout,中间放一个 GridLayout 的面板,底部再塞一个 FlowLayout 面板。每个面板各管一块,窗口缩放时比例也稳。
setLayout(null) 加 setBounds 能精确摆位置,但窗口一放大就露馅,高 DPI 屏幕上还容易错位,除了固定尺寸的小工具,不建议用。swing布局 的思路就一条:先用最简单的布局把结构搭出来,撑不住了再换 GridBagLayout 或者拆面板。