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主要事件类的层次结构:
低级事件:基于组件和容器的事件
监听接口
JDK的java.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个抽象方法。