20170706 AWT界面编程(上)

2017-07-06  本文已影响38人  houc

参考文献:《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另一个典型的容器,它代表不能独立存在,必须存放在其他容器中的容器。

上一篇 下一篇

猜你喜欢

热点阅读