20170706 AWT界面编程(上)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,044评论 0 4
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,211评论 0 2
  • 参考文献:《Java疯狂讲义》(第三版) 绝对定位 绝对定位步骤: 1、Container的布局管理器设成null...
    houc阅读 337评论 0 0
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,357评论 0 17
  • 【蔓珠~学而思-《追风筝的人》Day3-20170726】 那个悲伤的故事,我竟然忘记了阿米尔结婚这件事。今天听着...
    榕树下的野兔子阅读 311评论 0 1