AWT和布局管理器
- AWT(Abstract Window Toolkit)抽象窗口开发包

- component:可以显示出来的与用户进行交互的图形元素
- container:容纳其他component元素的容器;continer可以容纳component;所以container可以容纳container。
continer对象可以使用add方法添加其他的component对象。
一般的component不能独立显示出来,必须放在某一continer对象中才可以显示出来
两种常用的container:
1、Windows:自由停泊的顶级窗口
- Dialog:模态和非模态对话框;
- Frame:可做独立窗口显示出来
Frame的构造方法:
Frame()
Frame(String s)//创建标题栏为字符串的窗口
setBounds(int x,int y,int width,int height) //设置窗体位置和大小,x,y为左上角坐标(单位为像素);width和height是宽度和高度
setSize(int width,int height)//设置窗体的大小
setLocation(int x,int y)//设置窗体的位置
setBackground(Color c)//设置背景颜色,设置为color对象 cyan青色;magenta洋红
setVisible(boolean b)//设置是否可见
setTitle(String name) String getTitle()
setResizeble(boolean b) //设置是否可以调节大小
在未定义按钮的情况下,Ctrl+c
setLayout()//设置布局
import java.awt.Color;
import java.awt.Frame; public class TestMultiFrame {
public static void main(String args[]) {
MyFrame f1 =
new MyFrame(100,100,200,200,Color.BLUE);
MyFrame f2 =
new MyFrame(300,100,200,200,Color.YELLOW);
MyFrame f3 =
new MyFrame(100,300,200,200,Color.GREEN);
MyFrame f4 =
new MyFrame(300,300,200,200,Color.MAGENTA);
}
} class MyFrame extends Frame{
static int id = 0;
MyFrame(int x,int y,int w,int h,Color color){
super("MyFrame " + (++id));
setBackground(color);
setLayout(null);
setBounds(x,y,w,h);
setVisible(true);
}
}
运行结果:

2、Panel:不能自由停泊,不是顶级窗口,必须添加到continer里面才能显示出来。
Panel可以容纳其他的component对象(例如:Button),但是不能独立显示。
Panel可以有自己的布局管理器
Panel是一般容器,可以自身嵌套(比如在panel1里嵌入panel2);但Frame已经是顶层容器了,自身不能嵌套。
Panel的构造方法:
Panel()//使用默认FlowLayout类布局管理器初始化
Panel(LayoutManager layout)//使用指定的布局管理器初始化
Panel拥有从父类继承来的
setBounds(int x,int y,int width,int height)
setSize(int width,int height)
setLocation(int x,int y)
setBackground(Color c)
setLayout(LayoutManager mgr)
import java.awt.*;
public class TestMultiPanel {
public static void main(String args[]) {
new MyFrame2("MyFrameWithPanel",300,300,400,300);
}
}
class MyFrame2 extends Frame{
private Panel p1,p2,p3,p4;
MyFrame2(String s,int x,int y,int w,int h){
super(s);
setLayout(null);
p1 = new Panel(null); p2 = new Panel(null);
p3 = new Panel(null); p4 = new Panel(null);
p1.setBounds(0,0,w/2,h/2);
p2.setBounds(0,h/2,w/2,h/2);
p3.setBounds(w/2,0,w/2,h/2);
p4.setBounds(w/2,h/2,w/2,h/2);
p1.setBackground(Color.BLUE);
p2.setBackground(Color.GREEN);
p3.setBackground(Color.YELLOW);
p4.setBackground(Color.MAGENTA);
add(p1);add(p2);add(p3);add(p4);
setBounds(x,y,w,h);
setVisible(true);
}
}
运行结果:

?????是BorderLayout布局管理器?
为什么Frame可以独立显示而Panel不可以?
在Window类里定义了pack()和show()两个显示窗口的方法,被Frame继承了过来。这可能也是panel无法单独使用的一个原因吧,Panel和它的直接超类Container里,都没有定义类似pack()和show()的显示容器的方法。
- 布局管理器
管理component在container中的布局,不必直接设置component的大小和位置
每个continer都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其布局管理器,调用continer的setLayout方法改变其布局管理器对象
awt提供了5种布局管理器:(实现LayoutManager接口)
1、FlowLayout
panel类的默认布局管理器
逐行定位,行内从左到右,排满换行,不改变组件大小,按组件原有尺寸显示组件,可设置不同的组件间距,行距以及对齐方式。
FlowLayout的默认对齐方式为居中
setLayout(new FlowLayout())//FlowLayout实现了LayoutManager的接口//父类引用指向子类对象;
FlowLayout的构造函数:
new FlowLayout(FlowLayout.RIGHT,20,40);//右对齐,组件之间水平距离20像素,垂直距离40像素;
new FlowLayout(FlowLayout.LEFT); / /左对齐,水平和垂直距离为缺省值5
new FlowLayout();//居中对齐,水平和垂直距离为缺省值5(居中对齐为FlowLayout.CENTER)
import java.awt.*;
public class TestFlowLayout2 {
public static void main(String args[]) {
Frame f = new Frame("Java Frame");
FlowLayout l =
new FlowLayout(FlowLayout.CENTER, 20, 40);
f.setLayout(l);
f.setLocation(300,400);
f.setSize(300,200);
f.setBackground(new Color(204,204,255));
for(int i = 1; i<=7; i++){
f.add(new Button("BUTTON"));
}
f.setVisible(true);
}
}
运行结果:

2、BorderLayout
Frame类的默认管理器
BorderLayout将整个容器的布局分为:东(EAST)西(WEAST)南(SOUTH)北(NORTH)中(CENTER)五个布局,只能将组件放到指定区域。//为int型
如不指定组件位置,则将其放入CENTER;
每个区域只能加入一个组件,如加入多个,则先加入的会被覆盖。

BorderLayout布局尺寸缩放原则:
南北两个区域水平方向缩放
东西两个区域垂直方向缩放
中间可在两个方向上缩放
import java.awt.*;
public class TestBorderLayout {
public static void main(String args[]) {
Frame f;
f = new Frame("Border Layout");
Button bn = new Button("BN");
Button bs = new Button("BS");
Button bw = new Button("BW");
Button be = new Button("BE");
Button bc = new Button("BC"); f.add(bn, "North");
f.add(bs, "South");
f.add(bw, "West");
f.add(be, "East");
f.add(bc, "Center"); // 也可使用下述语句
/*
f.add(bn, BorderLayout.NORTH);
f.add(bs, BorderLayout.SOUTH);
f.add(bw, BorderLayout.WEST);
f.add(be, BorderLayout.EAST);
f.add(bc, BorderLayout.CENTER);
*/ f.setSize(200,200);
f.setVisible(true);
}
}
运行结果:

3、GridLayout
GridLayout将空间划分为小格,每个单元格大小相等。组件被填到每个单元格中,从左到右填满换行,从上到下。
GridLayout的构造方法:
例:GridLayout(3,4) //指定行数和列数
import java.awt.*;
public class TestGridLayout {
public static void main(String args[]) {
Frame f = new Frame("GridLayout Example");
Button b1 = new Button("b1");
Button b2 = new Button("b2");
Button b3 = new Button("b3");
Button b4 = new Button("b4");
Button b5 = new Button("b5");
Button b6 = new Button("b6");
f.setLayout (new GridLayout(3,2));
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.pack(); //包着button,button不改变大小,pack使窗口适应button大小
f.setVisible(true);
}
}
运行结果:

4、CardLayout
5、GridBagLayout
综合:
import java.awt.*;
public class TenButtons {
public static void main(String args[]) {
Frame f=new Frame("My Frame");
f.setLayout(new GridLayout(2,1));
Panel p1=new Panel();
Panel p2=new Panel();
Panel p21=new Panel();
Panel p22=new Panel();
p1.setLayout(new BorderLayout());
p2.setLayout(new BorderLayout());
p21.setLayout(new GridLayout(2,1));
p22.setLayout(new GridLayout(2,2));
p1.add(new Button("Button"), BorderLayout.EAST);
p1.add(new Button("Button"), BorderLayout.WEST);
p21.add(new Button("Button"));
p21.add(new Button("Button"));
p1.add(p21, BorderLayout.CENTER);
p2.add(new Button("Button"), BorderLayout.EAST);
p2.add(new Button("Button"), BorderLayout.WEST);
for(int i=0;i<4;i++){
p22.add(new Button("Button"));
}
p2.add(p22, BorderLayout.CENTER);
f.add(p1);
f.add(p2);
f.setVisible(true);
f.pack();
}
}
运行结果:

总结:
使用布局管理器时,布局管理器负责各个组件的位置和大小,用户不能设置位置和大小属性;
如果用户想自己设置,则取消容器的布局管理器,方法为:setLayout(null);
AWT和布局管理器的更多相关文章
- learning java AWT BoxLayout布局管理器
import javax.swing.*; import java.awt.*; public class BoxSpaceTest { private Frame f = new Frame(&qu ...
- AWT布局管理器
布局管理器 容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的.在AWT中为我们提供了以下5种布局管理器: ① FlowLayout 流式布局管理器 ② BorderLa ...
- learning java AWT 布局管理器 GridBagLayout
在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相关. import java.awt.*; public class GridBagTest { ...
- learning java AWT 布局管理器 GridLayout
GridLayout布局管理器将容器分割成纵横线分格的网格,每个网格所占的区域大小相同. import java.awt.*; public class GridLayoutTest { public ...
- Swing布局管理器介绍
创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...
- java基础 布局管理器
概念: 组建在容器(比如JFrame)中的位置和 大小 是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组建的布局管理. 种类: java共提供了物种布局管理器:流式布局管理 ...
- Java Swing 第03记 布局管理器
几种Swing常用的布局管理器 BorderLaout 它将容器分为5个部分,即东.南.西.北.中,每一个区域可以容纳一个组件,使用的时候也是通过BorderLayout中5个方位常量来确定组件所在的 ...
- Java——布局管理器
在Swing中使用的所有布局管理器都可以实现LayoutManager接口,在Swing中主要使用的5种布局管理器:FlowLayout.BorderLayout.GridLayout.CardLay ...
- Java基础之创建窗口——使用网格布局管理器(TryGridLayout)
控制台程序. 网格布局管理器可以在容器的矩形网格中布局组件. import javax.swing.*; import java.awt.*; import javax.swing.border.Et ...
随机推荐
- oracle 存储过程心得2
1.退出存储过程 return if old_save_time = new_save_time then--没有最新数据,退出 insert into hy_data_handle_mark(id, ...
- C++中const指针用法汇总
这里以int类型为例,进行说明,在C++中const是类型修饰符: int a; 定义一个普通的int类型变量a,可对此变量的值进行修改. const int a = 3;与 int const a ...
- 深入了解ZooKeeper(二)
在上篇博客<<深入了解ZooKeeper(一)>>中我们知道了分布式协调技术.分布式锁的实现和zookeeper服务机制,接下来将进一步了解zookeeper究竟能为我们做了什 ...
- python3.x 函数的参数
2016-08-09 15:06:18 位置参数 调用函数时,参数按照位置依次传递给函数 def show(a1,a2,a3,a4): print(a1,a2,a3,a4) show('s','h' ...
- Window Handle介绍
HANDLE(句柄)是Windows操作系统中的一个概念.在Windows程序中,有各种各样的资源(窗口.图标.光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄.句柄 ...
- sizeof与strlen()、递归优化题解
一.sizeof sizeof是C/C++中的一个操作符(operator),确切的说是一个编译时运算符,参数可以是数组.指针.类型.对象.函数等.用于统计类型或者变量所占的内存字节数.由于在编译时计 ...
- 【策略】一致性Hash算法
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- phpredis的使用
phpredis的具体使用方法可以参照:https://github.com/phpredis/phpredis
- fn project 试用之后的几个问题
今天试用fnproject 之后自己有些思考,后面继续解决 1. 目前测试是强依赖 dockerhub 的,实际可能不是很方便 2. 如何与k8s .mesos.docker swarm 集成 ...
- 半导体巨头青睐物联网领域 众强联手打造MCU生态系统
随着万物互联的时代到来,众多半导体巨头纷纷转战物联网领域.早在十年前,意法半导体曾将STM32推向市场,意法半导体对32位MCU在物联网方面的应用在两年前就已展开攻势. 4月25日,历经两届盛况的ST ...