刚学 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 或者拆面板。