11级_Java_曹建波5.03 GUI的组成&GUI事件处理

GUI的组成

GridLayout:网格布局

布局效果:将容器区域划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,按组件加入顺序先从左到右填满一行后换行,行间从上到下。

一个单元格区域放一个组件,因此组件大小被布局管理器强行控制,与单元格同等大小

构造方法
publicGridLayout()//所有组件位于一行中,各占一列
publicGridLayout(introws,intcols)//指定行数和列数的网格布局
publicGridLayout(introws,intcols,inthgap,intvgap)//指定水平间距和垂直间距

示例3:网格布局的使用。

f.setLayout(newGridLayout(3,2));

f.add(b1); f.add(b2);

f.add(b3); f.add(b4);

f.add(b5);

f.pack();

GridLayout布局的容器尺寸发生变化时,每个单元格的大小都将随之作调整,组件的大小也会发生变化。

正常情况下使用GridLayout布局时,向容器中加入的组件数目应与容器划分出来的单元格总数相等,但假如出现两者数目不等的情况,程序也不会出错,而是保证行数为设置值,列数则通过指定的行数和布局中的组件总数来进行调整。

CardLayout:卡片布局

布局效果:将多个组件在同一容器区域内交替显示,相当于多张卡片摞在一起,只有最上面的卡片是可见的。

一个组件就是一张卡片,每张卡片可以指定卡片名

CardLayout直接提供了组件的显示控制方法

构造方法
publicCardLayout()
publicCardLayout(inthgap,intvgap)

其他方法
publicvoidfirst(Containerparent)—显示第一张卡片
publicvoidlast(Containerparent)—显示最后一张卡片
publicvoidprevious(Containerparent)—显示前一张卡片
publicvoidnext(Containerparent)—显示后一张卡片
publicvoidshow(Containerparent,Stringname)

示例4:卡片布局的使用。

Framef=newFrame("CardLayoutExample");

CardLayoutc1=newCardLayout();

f.setLayout(c1);

Labellbl[]=newLabel[4];

for(inti=0;i<4;i++){

lbl[i]=newLabel(""+i+"");

f.add(lbl[i],"card"+i);

}

while(true){

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

c1.next(f);

}

GUI事件处理

JDK1.1开始,Java采用了一种名为“委托事件模型”的事件处理机制,以支持JavaGUI程序与用户的实时交互。

委托事件模型

事件(Event):用户在GUI组件上进行的操作,如鼠标单击、输入文字、关闭窗口等。

JDK中定义了多种事件类,用以描述GUI程序中可能发生的各种事件

约定:组件在与用户交互时,遇到特定操作则会触发相应的事件,即自动创建事件类对象并提交给Java运行时系统

事件源(EventSource):能够产生事件的GUI组件对象,如按钮、文本框等。

事件处理方法(EventHandler):能够接收、解析和处理事件类对象,实现与用户交互功能的方法。

事件监听器(EventListener):调用事件处理方法的对象。

系统在接受到事件类对象后,立即将其发送给专门的事件处理对象(监听器),该对象调用其事件处理方法,处理先前的事件类对象,进而实现预期的事件处理逻辑。

示例:委托事件模型的分析。

事件源:按钮

触发事件:ActionEvent

事件监听器:

importjava.awt.event.*;

publicclassMyEventListenerimplementsActionListener{

publicvoidactionPerformed(ActionEvente){

System.out.println("Abuttonhasbeenpressed!");

}

}

Frameframe=newFrame("TestActionEvent");

Buttonbtn=newButton("ClickMe!");

MyEventListenermel=newMyEventListener();

btn.addActionListener(mel);

frame.setLayout(newFlowLayout());

frame.add(btn);

frame.setSize(200,100);

frame.setVisible(true);

事件类

JavaGUI主要事件类的层次结构:

低级事件:基于组件和容器的事件

监听接口

JDKjava.awt.event包中定义了一系列的事件监听器接口,在这些接口中分别定义了各种类型的JavaGUI事件的处理方法,只有实现了这些接口的类对象才有资格作监听器,去处理相应类型的事件。

事件监听器类型和对应的事件处理方法都是事先约定好的

所有事件处理方法的返回值类型均为void

示例2:窗口的事件处理。

classWindowHandlerimplementsWindowListener{

voidwindowClosing(WindowEvent){

System.exit(0);

}

voidwindowOpened(WindowEvente){}

voidwindowIconified(WindowEvente){}

voidwindowDeiconified(WindowEvente){}

voidwindowClosed(WindowEvente){}

voidwindowActivated(WindowEvente){}

voidwindowDeactivated(WindowEvente){}

}

publicclassMyFrameextendsFrame{

publicMyFrame(){

super("框架窗口的Window事件");

WindowHandlerhandler=newWindowHandler();

addWindowListener(handler);

setSize(150,100);

setVisible(true);

}

publicstaticvoidmain(String[]args){

MyFrameframe=newMyFrame();

}

}

存在的问题:WindowHandler作为监听器类要处理“关闭”窗口动作,需要实现WindowListener接口,虽然只是用到一个相应的事件处理方法,但却不得不重写该接口中所有的7个抽象方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值