java swing自带的布局很难用,好在有个第三方布局库MigLayout,不过MigLayout对于新手来说很难用,因为找不到教程案例,也找不到参数说明,看着都是硬编码的参数,实际上弄懂了之后就觉得很强大,我们只需要学会其中的两种写法,基本上布局都能胜任了
先了解以下MigLayout的构造方法,一种是可以无参的,还有一种是带参,通常使用带参的就行,
第一个参数是针对整个JPanel而言的,第二个参数是针对行(水平),第三个针对列(垂直),
多个参数通过,分隔,下面讲解参数,
- debug, insets 25
其中debug表示开启调试,可以看到每个组件在每个单元格的box边框,方便调试布局,insets 25表示JPanel的上下左右间距25 - [grow]
表示水平方向展开到最大,我推荐展开 - “”
第三参数是针对列的,空表示不设置,当然也可以不填
JPanel jPanel = new JPanel(new MigLayout("debug, insets 25", "[grow]", ""));
继续往下按代码
jPanel.add(new JButton("按钮1"), "wrap,align right,span");
这里添加一个按钮1,相对应的参数wrap,align right,span
- wrap
表示在新增按钮1后进行换行 - align right
表示在整个组件中靠右对齐 - span
表示占满剩余的所有格子,使得变成整个一行就一格,所以会靠到JPanel的最右边,如果不加,在一行上存在多个单元格的时候,只会靠到当前单元格的右边
继续往下
jPanel.add(new JButton("测试2"),"w 50!, ");
- w 50!
表示设置宽度为50,同理h 50!,设置高度,也可以写成w 50%,通过百分比来设置宽高
//split合并单元的,再span扩展
jPanel.add(new JButton("按钮3"), "align right,split,span");
jPanel.add(new JButton("按钮3"), "gapleft 30");
jPanel.add(new JButton("按钮3"), "wrap");
- align right,split,span
当然行上存在多个列,会导致无法将一组按钮统一靠右对齐,那就可以通过split合并单元格,再通过span扩展 - gapleft 30
表示向左空开30
以上介绍的是Miglayout中基本的表格布局,下面再讲解一下强大的绝对定位布局
jPanel.add(new JButton("按钮5"), "id btn, pos 0.5al 0.5al, w 100!, h 100!");
jPanel.add(new JButton("按钮6"), "pos btn.x2 btn.y2");
//也可以这样写,pos null null btn.x btn.y
jPanel.add(new JButton("按钮7"), "pos btn.x-pref btn.y-pref");
jPanel.add(new JButton("按钮4"), "pos 1.0al 1.0al");
-
id btn, pos 0.5al 0.5al, w 100!, h 100!
这里可以设置一个组件的id为btn,pos 0.5al 0.5al表示在jPanel的中间,[pos 水平 垂直]的用法,范围是0-1表示最左-最右或最上到最下,例如pos 0al 0.5al表示水平靠左,垂直居中 -
pos btn.x2 btn.y2
表示相对于刚刚的btn坐标设置位置,btn.x,btn.y,btn.x2,btn.y2表示左上角和右下角的点位 -
pos btn.x-pref btn.y-pref
btn.x-pref表示左上角的点位再减去当前组件的pref宽度,不然和按钮6就重叠了
当然在这里还可以pos btn.x2+100 btn.y2+50,这样进行偏移计算
完整代码
JFrame frame = new JFrame("测试Miglayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
JPanel jPanel = new JPanel(new MigLayout("debug, insets 25", "[grow]", ""));
jPanel.add(new JButton("按钮1"), "wrap,align right,span");
jPanel.add(new JButton("测试2"),"w 50!, ");
jPanel.add(new JButton("按钮2"), "align left, span");
jPanel.add(new JButton("按钮2"), "align left, span, wrap");
jPanel.add(new JButton("按钮3"), "align right,split,span"); //split合并单元的,再span扩展
jPanel.add(new JButton("按钮3"), "gapleft 30");
jPanel.add(new JButton("按钮3"), "wrap");
jPanel.add(new JButton("按钮5"), "id btn, pos 0.5al 0.5al, w 100!, h 100!");
jPanel.add(new JButton("按钮6"), "pos btn.x2 btn.y2");
jPanel.add(new JButton("按钮7"), "pos btn.x-pref btn.y-pref"); //pos null null btn.x btn.y
jPanel.add(new JButton("按钮4"), "pos 1.0al 1.0al");
frame.add(jPanel);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
案例展示
当然MigLayout还有很多用法,不过目前这几项足够胜任大多数布局了