美文网首页
20170706 AWT界面编程(上)

20170706 AWT界面编程(上)

作者: houc | 来源:发表于2017-07-06 22:53 被阅读38次

    参考文献:《Java疯狂讲义》(第三版)

    知识点:

    Swing并没有完全替代AWT,而是建立在AWT基础之上,Swing仅提供了能力更强大的用户界面组件,即使是完全采用Swing编写的GUI程序,也依然需要使用AWT的事件处理机制。

    所有和AWT编程有关的类都放在java.awt包中以及他的子包中,

    AWT 编程中有两个基类:Component和Menu'Component。

    Component代表一个能以图形化方式显示出来,并可与用户交互的对象。

    TextField代表一个文本框

    ......

    import java.awt.*;

    public class FrameTest{

    public static void main(String[] args){

    Frame f=new Frame("Hello AWT");

    f.setBounds(30,30,250,200);

    f.setVisible(true);

    }

    }

    Panel是AWT另一个典型的容器,它代表不能独立存在,必须存放在其他容器中的容器。

    Panel是一个矩形区域,该区域内可盛装其他组件。Panel容器存在的意义在于为其他组件提供空间,其特点如下:

    1、可作为容器来盛装其他组件,为放置组件提供空间。

    2、不能单独存在,必须放置到其布局管理器。

    3、默认使用FlowLayout作为其布局管理器。

    ScrollPanel

    带滚动条的Panel

    布局管理器

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

    对于不同的组件而言,它们都有一个最佳大小,这个最佳大小通常是平台相关的,程序在不同平台上运行时,相同内容的大小可能不一样。如果让程序员手动控制每个组件的大小,位置,这将给编程带来的巨大的困难,为了解决这个问题,Java提供了LayoutManager,LayoutManager可以根据运行平台来调整组件的大小,程序员要做的,只是为容器选择合适的布局管理器。

    所有AWT容器都有默认的布局管理器,如果没有为容器指定布局管理器,则该容器使用默认的布局管理器。

    setLayout(LayoutManager Lm);

    FlowerLayout布局管理器

    BoderLayout布局管理器

    注意:

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

    2、如果想同一个区域中添加多个组件时候,后放入的组件会覆盖先放入的组件

    知识点:

    BorderLayout最多只能放置5个组件,但可以放置少于5个组件,如果么某个区域没有放置组件,该区域并不会出现空白,旁边区域的组件会自动占据该区域,从而保证窗口有较好的外观。

    虽然BorderLayout最多放置5个组件,但因为容器也是一个组件,所以我们可以先向Panel里添加多个组件,再把Panel添加到BorderLayout布局管理器中,从而让BorderLayout布局管理中实际组件数远远超过5个。

    GridLayout布局管理器

    GridLayout布局管理器将容器分割成纵横线分隔的网络,每个网络所占的区域大小相同。当向使用GirdLayout布局管理器的容器中添加组件时,默认从左向右、从上到下依次添加到每个网络中。

    与FlowLayout不同的是,放置在GridLayout布局管理器中组件的大小由组件所处的区域来决定。

    import java.awt.*;

    import java.applet.Applet;

    public class GridLayoutTest{

    public static void main(String[] args){

    Frame f=new Frame("计算器");

    Panel p1=new Panel();

    p1.add(new TextField(30));

    f.add(p1,"North");

    Panel p2=new Panel();

    //设置Panel使用GridLayout布局管理器

    String[] name={"0","1","2","3","4","5","6","7","8","9"};

    for(int i=0;i

    p2.add(new Button(name[i]));

    }

    f.add(p2);

    f.pack();

    f.setVisible(true);

    }

    }

    GridBagLayout布局管理器

    在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网络,并可以设置各网络的大小互不相同,从而增加了布局的灵活性。

    当窗口大小发生变化时,GridBagLayout布局管理器也可以准确地控制窗口各部分的拉伸。

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

    使用GridBagLaoyout步骤如下:

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

    2、创建GridBagConstraints对象,并设置该对象的相关属性;

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

    4、添加组件,与普通布局管理器添加组件的方法完全一样。

    重复步骤2~4;

    import java.awt.*;

    import java.applet.Applet;

    public class GridBagTest{

    private Frame f= new Frame("Test");

    private GridBagLayout gb=new GridBagLayout();

    private GridBagConstraints gbc=new GridBagConstraints();

    private Button[] bs =new Button[10];

    public void init(){

    f.setLayout(gb);

    for(int i=0;i

    bs[i]=new Button("按钮"+i);}

    gbc.fill=GridBagConstraints.BOTH;

    gbc.weightx=1;

    addButton(bs[0]);

    addButton(bs[1]);

    addButton(bs[2]);

    gbc.gridwidth=GridBagConstraints.REMAINDER;

    addButton(bs[3]);

    gbc.weightx=0;

    addButton(bs[4]);

    gbc.gridwidth=2;

    addButton(bs[5]);

    gbc.gridwidth=1;

    gbc.gridheight=2;

    gbc.gridwidth=GridBagConstraints.REMAINDER;

    addButton(bs[6]);

    gbc.gridwidth=1;

    gbc.gridheight=2;

    gbc.weighty=1;

    addButton(bs[7]);

    gbc.weighty=0;

    gbc.gridwidth=GridBagConstraints.REMAINDER;

    gbc.gridheight=1;

    addButton(bs[8]);

    addButton(bs[9]);

    f.pack();

    f.setVisible(true);

    }

    private void addButton(Button button){

    gb.setConstraints(button,gbc);

    f.add(button);

    }

    public static void main(String[] args){

    new GridBagTest().init();

    }

    }

    CardLayout布局管理器

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

    import java.awt.*;

    import java.awt.event.ActionListener;

    public class CardLayoutText{

    Frame f=new Frame("测试窗口");

    String[] names={"第一张","第二张","第三张","第四张","第五张"};

    Panel pl=new Panel();

    public void init(){

    final CardLayout c=new CardLayout();

    pl.setLayout(c);

    for(int i=0;i

    pl.add(names[i],new Button(names[i]));

    }

    //--------------------------------------------------

    Panel p=new Panel();

    ActionListener listener = e ->{

    switch(e.getActionCommand()){

    case "last":

    c.previous(pl);

    break;

    case "next":

    c.next(pl);

    break;

    case "第一张":

    c.first(pl);

    break;

    case "最后一张":

    c.last(pl);

    break;

    case "第三张":

    c.show(pl,"第三张");

    break;

    }

    };

    Button previous=new Button("last");

    previous.addActionListener(listener);

    Button next=new Button("next");

    next.addActionListener(listener);

    Button first=new Button("第一张");

    first.addActionListener(listener);

    Button last =new Button("最后一张");

    last.addActionListener(listener);

    Button third=new Button("第三张");

    third.addActionListener(listener);

    p.add(previous);

    p.add(next);

    p.add(first);

    p.add(last);

    p.add(third);

    f.add(p);

    f.add(pl);

    //f.add(p,BorderLayout.SOUTH);

    f.pack();

    f.setVisible(true);

    }

    public static void main(String[] args){

    new CardLayoutText().init();

    }

    }

    Panel是AWT另一个典型的容器,它代表不能独立存在,必须存放在其他容器中的容器。

    相关文章

      网友评论

          本文标题:20170706 AWT界面编程(上)

          本文链接:https://www.haomeiwen.com/subject/ezohhxtx.html