线性布局
线性布局,包含水平布局和竖直布局两种
以水平布局为例
内容添加了4个子控件,每个控件的宽度占多少?
水平布局器 AfXLayout,水平方向上依次排列
-
对子空间进行水平方向上的布局
-
每个子控件可以单独指定宽度
- "100px" 固定占100像素 - "25%" 固定占宽度的25% - "auto" 固定使用它的Preferred Size - "1w" 按权重动态分配(分配剩余的空间,比如一个控件为"2w",一个控件为"3w",则它们将以2:3的比例瓜分剩余空间)
代码:
class MyFrame extends JFrame{
ColorfulLabel a1 = new ColorfulLabel("1", Color.YELLOW);
ColorfulLabel a2 = new ColorfulLabel("2", Color.BLUE);
ColorfulLabel a3 = new ColorfulLabel("3", Color.RED);
ColorfulLabel a4 = new ColorfulLabel("4", Color.GREEN);
public MyFrame(String title) {
super(title);
JPanel root = new JPanel();
this.setContentPane(root);
//设置为横向布局
//注:AfXLayout 与 AfRowLayout等效
root.setLayout(new AfXLayout(8));
root.add(a1, "100px");
root.add(a2, "30%");
root.add(a3, "auto");
root.add(a4, "1w");
}
private class ColorfulLabel extends JLabel{
public ColorfulLabel(String text, Color color) {
this.setText(text);
this.setOpaque(true);
this.setBackground(color);
this.setHorizontalAlignment(SwingConstants.CENTER);
}
}
}
输出:
要点与细节:
- 提供水平/竖直布局器,以方便后续的练习,内部实现比较复杂,不用研究
- AfXLayout 和 AfYLayout 分别与 AfRowLayout 和 AfColumnLayout 等效,后面可能会混合出现
自由位置布局
自由位置布局 AfAnyWhere
自由指定每一个控件的位置,可以为任何大小、任意位置
一般步骤:
-
创建布局器:
panel.setLayout(new AfAnyWhere()); -
添加子控件时,指定AfMargin参数
-
panel.add(label, new AfMargin(-1, 15, 20 , 15));
代码:
public MyFrame(String title) {
super(title);
JPanel root = new JPanel();
this.setContentPane(root);
//设为任意位置布局
root.setLayout(new AfAnyWhere());
//左上,相当于 new AfMargin(0, 0, -1, -1)
root.add(a1, AfMargin.TOP_LEFT);
//右上,相当于 new AfMargin(0, -1, -1, 0)
root.add(a2, AfMargin.TOP_RIGHT);
//中间,相当于 new AfMargin(-1, -1, -1,- 1)
root.add(a3, AfMargin.CENTER);
//自由位置定义
root.add(a4, new AfMargin(-1, 15, 20, 15));
}
显示: