图形界面

Swing并没有完全替代AWT,而是建立在AWT寄出上,Swing仅提供了能力更强大的用户界面组件,及时完全采用Swing编写的GUI程序,也依然需要使用AWT的时间处理机制。
所有和AWT相关的类都在java.awt包及子包中。AWT有两个基类:Component和MenuComponent。
Component代表一个能以图形化方式显示出来并且与用户交互的对象
MenuComponent代表土星界面的菜单组件
AWT图形用户界面编程还有两个重要的概念:Container和LayoutManager,Container是一种特殊的Component,它代表一种容器,可以盛装普通的Component;而LayoutManager则是容器管理其他组件布局的方式。
setLocation(int x. int y):设置组件的位置
setSize(int  width, int heigth):设置组件的大小
setBounds(int x, int y, int width, int heigth):同时设置组件的位置、大小
setVisible(Boolean b):设置该组件的可见性
容器还可盛装其他组件,容器(Container)提供了几种常用方法来访问容器中的组件:
Component add(Component comp):向容器中添加其他组件(该组件既可以是普通组件。也可以是容器),并返回被添加的组件
Component getComponentAt(int x, int y):返回指定点的组件
int getComponentCount():返回该容器内组件的数量
Component[] getCompinents():返回该容器内所有的组件
AWT主要提供了两种主要的容器类型:
Window:可独立存在的顶级窗口
Panel:可作为容器容纳其他组件,但不能独立存在,必须添加到其他容器中。
Frame代表常见窗口,它是Window类的子类,具有如下几个特点:
Frame对象有标题,允许通过拖拉来改变窗口的位置、大小
初始化为不可见,可用setVisible(true)使其显示出来
默认使用BorderLayout作为其布局管理器

import java.awt.*;
public class FrameTest{
    public static void main(String[] args){
        Frame F = new Frame("测试窗口");
        F.setBounds(30, 30, 260, 200);
        F.setVisible(true);
    }
}

上面这个程序运行可以看出AWT是调用程序运行平台的本地API创建该窗口的。如果单击创建窗口“关闭”按钮,该窗口无法关闭,因为未为该窗口编写任何事件响应。
Panel是AWT中另一个典型的容器,它代表不能独立存在、必须放在其他容器中的容器。Panel外在表现为一个矩形区域,该区域可盛装其他组件。Panel容器存在的一样在于为其他组件提供空间。
Panel容器具有如下几个特点:
1、可作为容器盛装其他组件,为防止组件提供空间
2、不能单独存在,必须放置到其他容器中
3、默认使用FlowLayout作为其布局管理器

import java.awt.*;
public class PanelTest{
    public static void main(String[] args){
        Frame F = new Frame("测试窗口");
        Panel P = new Panel();
        P.add(new TextField(20));
        P.add(new Button("点我"));
        F.setBounds(30, 30, 200, 300);
        F.add(P);
        F.setVisible(true);
    }
}

 ScrollPane是一个带滚动条的容器,不能独立存在,必须被添加到其他容器中,ScrollPane有如下几个特点:
1、可作为容器盛装其他组件,当组件占用空间过大时,ScorllPane会自动产生滚动条,当然也可以通过制定的构造器参数来制定默认具有滚动条
2、不能独立存在,必须放置到其他容器中
3、默认使用BorderLayout作为其布局管理器,ScorllPane通常用于盛装其他容器,所以通常不允许改变ScorllPane的布局管理器

import java.awt.*;
public class PanelTest{
    public static void main(String[] args){
        Frame F = new Frame("测试窗口");
        //ScrollPane.SCROLLBARS_ALWAYS 指定无论滚动窗格和子组件各自大小如何,总是显示水平/垂直滚动条
        ScrollPane SP = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
        SP.add(new TextField(20));
        SP.add(new Button("按钮"));
        F.add(SP);
        F.setBounds(30, 30, 200, 300);
        F.setVisible(true);
    }
}

以上程序向容器添加一个文本框和一个按钮,但是只能看到一个按钮,却看不到文本框,这是因为ScrollPane使用BorderLayout布局管理器的原因,导致只有一个组件被显示出来。

布局管理器
为了使生成的图形用户界面具有良好的平台无关性,Java语言提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。

//例如:定义一个标签(Label):
Label hello = newLabel("Hello Java");

为了使生成的图形用户界面具有良好的平台无关性,Java语言提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。
为了更好地容纳“Hello Java”字符串,也就是实现该标签的最佳大小(既没有多余空间,也没有内容被遮挡),Windows和UNIX不同平台像素不同,如果程序从Win一直到UNIX上,程序需要做大量的工作调整图形界面。
对于不同的组件而言,它们都有一个最佳大小,这个最佳大小通常是平台相关的,程序在不同平台上运行,相关内容的大小可能不一样。如果程序猿手动控制大小、位置,那实在太蛋疼了,Java提供了LayoutManager,LayoutManager可以根据运行平台来调整组件大小,程序员要做到,只是为容器选择合适的布局管理器。
所有AWT容器都有默认的布局管理器,如果没有为容器指定布局管理器,系统使用默认的布局管理器。为容器指定布局管理器通过调用容器对象的setLayout(LayoutManager lm)方法来完成。

c.setLayout(new XxxLayout());

AWT提供了FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout 5个常用的布局管理器,Swing还提供了一个BoxLayout布局管理器

FlowLayout布局管理器
在FlowLayout布局管理器中,组件像水流一样向某方向流动(排列)、遇到障碍(边界)就折回,重头开始排列。在默认情况下,FlowLayout布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。
FlowLayout有三个构造器:
FlowLayout():使用默认的对其方式及默认的垂直间距、水平间距创建FlowLayout布局管理器
FlowLayout(int align):使用指定的对其方式及默认间距、水平间距创建FlowLayout布局管理器
FlowLayout(int align, int hgap, iint vgap):使用指定对其方式及指定的垂直间距、水平间距创建FlowLayout布局管理器
hgap:水平间距
vgap:垂直间距
align:表明FlowLayout中组件的排列放心(从左向右,从右向左,从中间向两边等),该参数使用FlowLayout类的静态常量:FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT。
Panel和Applet默认使用FlowLayout布局管理器

import java.awt.*;
public class PanelTest{
    public static void main(String[] args){
        Frame F = new Frame("测试窗口");
        F.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 5));  //水平间距20,垂直间距5
        for(int i = 0; i < 10; i++){
            F.add(new Button("按钮" + i));
        }
        F.pack();  //设置窗口为最佳大小
        F.setVisible(true);
    }
}

pack()方法是Windows提供的一个方法,该方法用于将窗口调整到最佳大小。Java编写图形界面程序很少直接设置窗口的大小。通常都是调用pack()方法来将窗口调整到最佳大小。
BorderLayout布局管理器
BorderLayout将容器分为EAST、SOUTH、WEST、NORTH、CENTER 5个区域,普通组件可以被放置在这5个区域任意一个钟。
布局为:上:NORTH; 下:SOUTH; 左:WEST; 右:EAST 中:CENTER 上北下南左西右东
BorderLayout有两个注意点:1、当向BorderLayout布局管理器的容器中添加组件时,需要指定添加到哪个区域中。如果没有指定,默认添加到中间区域;2、如果向同一区域添加多个组件,后放入的组件会覆盖先放入的组件
Frame、Dialog、SCrollPane默认使用BorderLayout布局管理器,BorderLayout有两个构造器:
BorderLayout():使用默认的水平间距、垂直间距创建BorderLayout布局管理器
BorderLayout(int hgap, int vgap):使用指定的水平间距、垂直间距创建BorderLayout布局管理器

import java.awt.*;
public class PanelTest{
    public static void main(String[] args){
        Frame F = new Frame("测试窗口");
        //默认BorderLayout布局管理器,所以这行是可以省略的
        F.setLayout(new BorderLayout(20, 5));
        F.add(new Button("南") , SOUTH); //写成BorderLayout.SOUTH就可以,尼玛书上是在逗我吗
        F.add(new Button("北") , NORTH);
        F.add(new Button("西") , WEST);
        F.add(new Button("东") ,  EAST);
        //没有指定默认放在中间
        F.add(new Button("中神通"));
        //设置窗口为最佳大小
        F.pack();
        F.setVisible(true);
    }
}

BorderLayout最多只能放置5个组件,但是我们可以将Panel放入BorderLayout中,就可以让BorderLayout布局管理中实际组件数远远超过5个

GridLayout布局管理器

GridLayout布局管理器将容器分割成纵横分割的网格,每个网格所占的区域大小相同。当向使用GridLayout布局管理器容器中天界组件时,默认从左向右,从上向下依次添加到网格中。与FlowLayout不同的是,防止在GridLayout布局管理器中的各组件的大小由组件所处的区域来决定(每个组件自动占满整个区域)

GridLayout有两个构造器

1、GridLayout(int rows, int cols):采用指定的行数、列数,以及默认的横向间距、纵向间距将容器分割成多个网格。

2、GridLayout(int rows, int cols, int hgap, int vgap):采用指定的行数、列数,以及指定的航向间距。纵向间距将容器分割成多个网格。

import java.awt.*;
public class GridLayoutTest{
    public static void main(String[] args){
        Frame f = new Frame("测试窗口");
        Panel p1 = new Panel();
        p1.add(new TextField(30));
        Panel p2 = new Panel();
        p2.setLayout(new GridLayout(3, 5, 4, 9));
        String[] name = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", "*", "/", "." };
        for(int i = 0; i < name.length; i++){
            p2.add(new Button(name[i]));
            }
        //NORTH是布局的静态变量,直接写NORTH就编程的当前类的静态变量,所以应该写成BorderLayout.NORTH
        f.add(p1, BorderLayout.NORTH);
        f.add(p2);
        f.pack();
        f.setVisible(true);
        }
    }

GridBagLayout布局管理器

GridBagLayout布局管理器一个组件可以跨越一个或多个网格,并可以设置个网格的大小互不相同,从而增加布局的灵活性,当窗口大小发生变化时,GriBagLayout布局管理器也可以准确地控制窗口各部分的拉伸。

为了处理GridBagLayout中GUI组件的大小、跨越性,Java提供了GridBagConstrains对象,该对象与特定GUI组件关联,用于控制该GUI组件的大小、跨越性。

使用GridBagLayout布局管理器的步骤如下:

1、创建GriBagLayout布局管理器,并指定GUI容器使用该布局管理器

GridBagLayout gb = new GridBagLayout();
container.setLayout(gb);

2、创建GridBagLayout对象,并设置该对象的相关属性(用于设置受该对象控制的GUI组件的大小、跨越性等)

3、调用GridBagLayout对象的方法来建立GridBagConstraints对象和受控制组件之间的关联

gb.GridBagConstraints(c, gbc);
//设置c组件受gbc对象控制

4、添加组件,和普通的组件方法一样

如果需要向一个容器中添加多个GUI组件,则需要重复步骤2到4.GridBagConstraints对象可以多次重用,所以实际只需要创建一个GridBagConstraints对象,每次组件之前先改变GridBagConstraints对象的属性即可。
gridx、gridy:设置该属性控制的GUI组件左上角所在网格的横向索引、纵向索引(GridBagLayout左上角网格索引为0、0),这两个值还可以是GridBagConstraints.RELATIVE(默认值),它表明当前组件紧跟在上一组件之后。
gridwidth、gridheigth:设置受该对象控制的GUI组件横向、纵向跨越多少个网格,该属性默认值都是1.如果设置两个属性值为GridBagConstraints.REMAINDER,表明受该对象控制的GUI组件是横向、纵向最好一个组件;如果设置这两个属性值为GridBagConstraints.RELATIVE,这表明受该对象控制的GUI组件是横向、纵向倒数第二个组件。
fill:设置该对象控制的GUI组件如何占据空白区域,该属性取值如下:
 *GridBagConstraints.NONE:GUI组件不扩大
 *GridBagConstraints.HORIZONTAL:GUI组件水平开大以占据空白区域
 *GridBagConstraints.VERTICAL:GUI组件垂直扩大以占据空白区域
ipadx、ipady:设置受该对象控制的GUI组件横向、纵向内部填充的大小,即在该组件最小尺寸的基础上还需要增大多少。如果设置了这两个属性,则组件横向大小最小宽度再加ipad*2像素,纵向最小高度再加ipady*2像素
insets:设置受该对象控制的GUI组件的外部填充的大小,即该组件边界和显示区域边界直接的距离
anchor:设置受该对象控制的GUI组件在其显示区域中的定位方式。定位方式如下:
 GridBagConstraints.CENTER(中间)
 GridBagConstraints.NORTH(上中)
 GridBagConstraints.NORTHWEST(左上角)
 GridBagConstraints.NORTHEAST(右上角)
 GridBagConstraints.SOUTH(下中)
 GridBagConstraints.SOUTHEAST(右下角)
 GridBagConstraints.SOUTHWEST(左下角)
 GridBagConstraints.EAST(右中)
 GridBagConstraints.WEST(左中)
weightx、weighty:设置受该对象控制的GUI组件占据多余空间的水平、垂直增加比例(也叫权重,即weight的直译),这两个属性的默认值是0,即该组件不占据多余空间。假设某个容器水平线包括3个GUI组件,他们水平增加比例分别是1/2/3,但容器宽度增加60像素,则第一个组件增加10。第二个20,第三个30.如果其增加比例为0,则表示不会增加。
**如果希望某个组件的大小岁容器的增大而增大,则必须同时设置控制该组件的GridBagConstraints对象的fill属性和weights、weighty属性**

CardLayout布局管理器
CardLayout布局管理器是以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片,每次只有最上面的Component才可见。

CardLayout有两个构造器:

CardLayout():创建默认的CardLayout布局管理器

CardLayout(int hgap, int vgap):通过制定卡片与容器左右边界的间距(hagp)、上下边界(vgap)的间距创建CardLayout布局管理器

CardLayout用于控制组件可见的5个常用方法:

first(Container target):显示target容器中的第一张卡片

last(Container target):显示terget容器中最后一张卡片

previous(Container target):显示target容器中前一张卡片

next(Container target):显示target容器中的后一张卡片

show(Container target,String name):显示target容器中指定名字的卡片

BoxLayout布局管理器

BoxLayout(Contrainer target, int axis):指定创建基于target容器的BoxLayout容器布局管理器,该布局管理器里的组件按axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。

BoxLayout布局管理器通常和Box容器结合使用,Box是一个特殊的容器,有点像Panel容器,但该容器默认使用BoxLayout布局管理器。提供了如下两个静态方法来创建Box对象

creatHorizontalBox():创建一个水平排列组件的Box容器

CreatVerticalBox():创建一个垂直排列组件的Box容器

 

你可能感兴趣的:(图形界面)