Java基础知识整理20(ADT)

AWT编程:
Java使用AWT和Swing类完成图形用户界面编程,其中AWT的全称是抽象窗口工具集(Abstract Window Toolkit),它是Sun最早提供的GUI库,后来又提供了Swing库。
GUI(图形用户界面)和AWT:
AWT是窗口框架,它从不同平台的窗口系统中抽取出共同组件,当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台。
当使用AWT编写图形界面的应用时,程序仅指定了界面组件的位置和行为,并未提供真正的实现,jvm调用操作系统本地的图形界面来创建和平台一致的对等体。
Swing组件替换了绝大部分的AWT组件。
AWT编程有两个基类:Component和MenComponent:
在这里插入图片描述
Component代表一个能以图形化方式显示出来,并可与用户交互的对象。
AWT图形用户界面编程里还有两个重要概念:Container和LayoutManager,其中Container是一种特殊的Component,他代表一种容器,可以盛装普通的Component,而LayoutManager则是容器管理器中其他组件的方式。
AWT容器:
容器(Container)是Component的子类,因此容器对象本身也是一个组件,具有组件的所有性质,可以调用Component的所有方法,Component的类有如下几个常见的方法来设置组件的大小,位置和可见性等。
SetLocation(int x,int y):设置组件位置。
SetSize (int width,int heigh):设置组建的大小。
SetBounds(int x,int y,int width,int heigh):同时设置组建的位置和大小
Setvisible(Boolean b):设置该组件的可见性
容器类(Container)主要提供了如下几个常用的方法来访问容器里的组件:
Component add(Component comp):向容器中添加其他组件(组件既可以是普通组件,也可以是容器),并返回被添加的组件。
Component getComponentAt(int x,int y):返回指定的组件。
Int getComponentsCount():返回该容器内组件的数量。
Component[] getComponents():返回该容器内所有组件
AWT主要提供两种主要的容器类型:
Window:可独立存在的顶级窗口
Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中
AWT的容器的继承关系图:
在这里插入图片描述
Frame具有如下几个特征:

  1. Frame对象有标题,允许通过拖拉来改变窗口的位置,大小

  2. 初始化时为不可见,可用setVisible(true)使其显示出来。

  3. 默认使用BorderLayout作为其布局管理器
    Panel是AWT中另一个典型的容器,它代表不能独立存在,必须放在其他容器中的容器,panel外在表现为一个矩形区域,该区域内可以盛装其他组件。Panel容器存在的意义在于为其它组件提供空间,panel容器具有如下特点:

  4. 可作为容器盛装其他组件,为放置组件提供空间

  5. 不能单独存在,必须放置到其他容器中。

  6. 默认使用FlowLayout作为布局管理器
    在这里插入图片描述
    ScrollPane是一个带滚动条的容器,它不能独立存在,必须添加到其他容器中,ScrollRane容器具有如下几个特点:

  7. 可作为容器来盛装其他组件,当组建占用空间过大时,scrollpane就会产生滚动条。当然也可以通过指定特定的构造器参数来指定默认具有滚动条。

  8. 不能单独存在,必须放置到其他容器中。

  9. 默认使用BorderLayout作为其布局管理器,Scroll Pane通常用于盛装其他容器所以通常不允许改变Scroll Pane的布局管理器。
    布局管理器:
    LayoutManager可以根据平台来调整组件的大小。为容器指定布局管理器通过调用容器
    对象的setLayoutManager(LayoutManager lm)方法来完成,如:
    c.setLayoutManager(new XXXLayout());
    AWT 提供了FlowLayout, BorderLayout, GridLayout, GridBigLayout, Cardlayout五个常用的布局管理器,Swing还提供了一个BoxLayout布局管理器。
    Flow Layout布局管理器:
    默认情况下,Flow Layout布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。
    Flow Layout有三个构造器:

  10. Flow Layout():使用默认对齐方式,默认垂直,水平间距创建Flow Layout布局管理器

  11. Flow Layout(int align):使用指定对齐方式,默认垂直,水平间距创建Flow Layout布局管理器。

  12. Flow Layout(int align,int hgap,int vgap):使用指定对齐方式,指定垂直,水平间距创建Flow Layout布局管理器。
    hgap,vgap代表水平间距,垂直间距,为这两个参数传入整数值即可。其中align表明
    FlowLayout中组件的排列方式(从左到右,从右向左,从中间到两边等),该参数使用Flow Layout静态常量:Flow Layout.LEFT, Flow Layout.CENTER, Flow Layout.RIGHT。
    Panel和Applet默认使用Flow Layout布局管理器
    在这里插入图片描述
    f.pack():是调用该方法来将窗口调整到最佳大小。
    BorderLayout布局管理器:
    BorderLayout将容器分为,EAST,SOUTH,WEST,NORTH,CERTER五个区域,普通组件可以被放置在这五个区域中任意一个。
    当改变使用BorderLayout的容器大小时,NORTH,SOUTH和CERTER区域水平调整,而EAST,WEST和CENTER垂直调整,使用Border Layout注意两点:

  13. 当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到那个区域里,如果没有指定添加到那个区域里,则默认添加到中间区域里。

  14. 如果向同一个区域添加多个组件时,后放入的会覆盖前面的组件。
    Frame,Dialog,Scroll Pane默认使用BorderLayout布局管理器,Border Layout有如下两
    个构造器:
    BorderLayout():使用默认水平间距,垂直间距创建BorderLayout布局管理器。
    BorderLayout(int hgap,int vgap):使用指定的水平间距,垂直间距创建BorderLayout布局管理器。
    GridLayout布局管理器:
    Grid Layout布局管理器将容器分割成纵横线分割的网格,每个网格所占的区域大小相
    同,当向使用Grid Layout的容器中添加组件时,默认从左到右,从上到下一次添加到每个网格中,与flowLayout不同的是,放在GridLayout布局管理器中的各组件的大小由组件所处的区域来决定(每个组件将自动涨大到占满整个区域)
    Grid Layout有如下两个构造器:

  15. Grid Layout(int rows,int cols):采用指定行数,列数,默认横向间距,纵向间距将容器分割成多个网格。

  16. Grid Layout(int rows,int cols,int hgap,int vgap):采用指定行数,列数,指定横向间距,纵向间距将容器分割成多个网格。
    BorderLayout最多只能放五个组件,但可以放少于五个组件,如果某个区域没有放置组
    件,该区域并不会出现空白,旁边区域的组件会自动占据该区域,从而保证窗口有较好的外观,但因为容器也是一个组件,所以我们可以先向panel里添加多个组件,再把Panel添加到BorderLayout布局管理器中,从而让BorderLayout布局管理中的实际组件数远超过五个。
    GridBagLayout布局管理器:
    与GridLayout布局管理器不同的是:在GridBagLayout中布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性,当窗口的大小发生变化时,GridBagLayout布局管理也可以准确的控制窗口各部分的反应。
    Java提供了GridBagLayout对象,该对象与特定的GUI组件关联,用于控制该GUI组件的大小,跨越性。
    1.使用GridBagLayout布局管理器,并指定GUI容器使用该布局管理器如:
    Grid BagLayout gb=new Grid BagLayout();
    Constainer.setLayout(gb);
    2.创建GridBagConstraints对象,并设置该对象的相关属性(用于设置受该对象控制的GUI组件)如下:
    gbc.gridx=2;//设置受该对象控制的GUI组件应位于网格的横向索引
    gbc.gridy=1;//设置受该对象控制的GUI组件应位于网阔的纵向索引
    Gbc.gridwidth=2;//设置受该对象控制的GUI组件横向跨越多少个网格
    Gbc.gridheight=1;//设置受该对象控制的GUI组件纵向跨越多少个网格

  17. 调用GridBagConstraints对象的方法来建立GridBagConstraints对象和受控制组件之间的关联,如下代码:
    gb.setConstraints(c.gbc);//设置c组件受gbc对象的控制

  18. 添加组件,与普通布局管理器添加组件完全一致如下:
    Constainer.add©;
    使用GridBagLayout布局管理器的关键在于GridBagConstraints,他才是精确控制的每个GUI组件的核心类。
    如果希望某个组件的大小会随容器的增大而增大,则必须同时设置该组件的Grid Bag Constraints对象的fill属性和weightx,weighty属性。
    在这里插入图片描述
    在这里插入图片描述
    Card Layout布局管理器:
    Card Layout布局管理器以时间而非空间来管理他们的组件,他将加入容器的所有组件看成一层叠卡片,每次只有最上面的那个Component才可见,Card Layout提供了两个构造器:
    Card Layout():创建默认的Card Layout布局管理器
    Card Layout(int hgap,int vgap):通过指定卡片与容器左右边界间距(hgap),上下边界(vgap)的间距来创建Card Layout布局管理器。
    常见的五个方法:first(Container target):显示target容器中第一个卡片
    Last(Container target):显示target容器中最后一个卡片
    Previous(Container target):显示target容器中前一个卡片
    Next(Container target):显示target容器中后一个卡片。
    Show(Container target,String name):显示target容器中指定名字的卡片
    public class TestCardLayout {
    Frame f=new Frame(“测试窗口”);
    String[] names= {“第一张”,“第二张”,“第三章”,“第四章”,“第五张”};
    Panel p1=new Panel();
    CardLayout c=new CardLayout();
    public void init() {
    p1.setLayout©;
    for (int i = 0; i < names.length; i++) {
    p1.add(names[i], new Button(names[i]));
    }
    Panel p=new Panel();
    Button pervious=new Button(“上一张”);
    pervious.addActionListener(new ActionListener() {

    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		c.previous(p1);
    	}
    });
    Button next=new Button("下一张");
    next.addActionListener(new ActionListener() {
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		c.next(p1);
    	}
    });
    Button first =new Button("第一张");
    first.addActionListener(new ActionListener() {
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		c.first(p1);
    	}
    });
    Button last =new Button("最后一张");
    last.addActionListener(new ActionListener() {
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		c.last(p1);
    	}
    });
    Button third=new Button("第三章");
    third.addActionListener(new ActionListener() {
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		c.show(p1, "第三章");
    	}
    });
    p.add(pervious);
    p.add(next);
    p.add(first);
    p.add(last);
    p.add(third);
    f.add(p1);
    f.add(p,BorderLayout.SOUTH);
    f.pack();
    f.setVisible(true);
    

    }
    public static void main(String[] args) {
    new TestCardLayout().init();
    }

}
在这里插入图片描述
绝对定位:
Java也可以对GUI组件进行绝对定位。
步骤如下:

  1. 将Container的布局管理器设成null:setLayout(null);
  2. 往容器上加组件的时候,先调用setBounds()或setSize()方法来先设置组建的大小,位置。或者直接创建GUI组件时通过构造参数指定该组件的大小,位置,然后将该组件添加到容器中。
    在这里插入图片描述
    BoxLayout布局管理器:
    Box Layout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了一个如下的简单构造器。
    BoxLayout(Container target,int axis):指定创建基于target容器的Box Layout布局管理器,该布局管理器里组件按axis方向排列,其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
    在这里插入图片描述
    BoxLayout通常和Box容器结合使用,Box是一个特殊的容器,该容器默认使用BoxLayout
    布局管理器,box提供了如下两个静态方法来创建Box 对象:
    CreateHorizontalBox():创建一个水平排列组件的Box容器
    CreateVerticalBox():创建垂直排列组建的Box容器
    在这里插入图片描述
    BoxLayout没有提供设置间距的构造器和方法,因为BoxLayout采用另一种方式来控制组件的间距。BoxLayout使用Glue(橡胶),Strut(支架)和RigidArea(刚性区域)组件来控制组件间的距离。其中Glue代表可以在横向,纵向两个方向同时 拉伸的空白组件(间距),
    Strut代表可以在横向,纵向任意一个方向上拉伸的空白组件(间距),RigitArea代表不可拉伸的空白组件(间距)
    Box提供了如下五个静态方法来创建Glue,Strut和Rigid Area
    CreateHorizontalGlue():创建一条水平Glue(可在两个方向同时拉伸的间距)
    CreateVerticalGule():创建一条垂直的Glue(可在两个方向同时拉伸间距)
    CreateHorizontalStrut(int width):创建一条指定宽度水平Strut(可在垂直方向上拉伸的间距)
    createVerticalStrut(int height):创建一条指定高度垂直Strut(可在水平方向上拉伸的间距)
    createRigidArea(Dimension d):创建指定宽度,高度的Rigid Area(不可拉伸的间距)
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值