GUI的组成

GridLayout:网格布局

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

 

  

 

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

 

 

 

 

 

 

 

构造方法
public GridLayout()//所有组件位于一行中,各占一列 
public GridLayout(int rows,int cols)// 指定行数和列数的网格布局 
public GridLayout(int rows,int cols,int hgap,int vgap)// 指定水平间距和垂直间距

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

f.setLayout(new GridLayout(3,2));

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

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

f.add(b5);

f.pack();

 

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

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

CardLayout:卡片布局

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

 

 

 

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

 

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

 

 

 

 

 

 

构造方法
public CardLayout()
public CardLayout(int hgap, int vgap)

其他方法
public void first(Container parent)—显示第一张卡片
public void last(Container parent)—显示最后一张卡片
public void previous(Container parent)—显示前一张卡片
public void next(Container parent)—显示后一张卡片
public void show(Container parent,String name)

 

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

Frame f=new Frame("CardLayout Example");

CardLayout c1=new CardLayout();

f.setLayout(c1);

Label lbl[]=new Label[4];

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

lbl[i]=new Label("第"+i+"页");

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

}

while(true){

try{

Thread.sleep(1000);

}catch(InterruptedException e){

e.printStackTrace();

}

c1.next(f);

}

GUI事件处理

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

 委托事件模型

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

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

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

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

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

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

 

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

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

事件源:按钮

触发事件:ActionEvent

事件监听器:

import java.awt.event.*;

public class MyEventListener implements ActionListener{

public void actionPerformed(ActionEvent e){

System.out.println("A button has been pressed!");

}

}

Frame frame=new Frame("TestActionEvent");

Button btn=new Button("Click Me!");

MyEventListener mel=new MyEventListener();

 

btn.addActionListener(mel);

frame.setLayout(new FlowLayout());

frame.add(btn);

frame.setSize(200,100);

frame.setVisible(true);

事件类

      Java GUI主要事件类的层次结构: 

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

监听接口

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

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

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

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

class WindowHandler implements WindowListener{

void windowClosing(WindowEvent){

System.exit(0);

}

void windowOpened(WindowEvent e){}

void windowIconified(WindowEvent e){}

void windowDeiconified(WindowEvent e){}

void windowClosed(WindowEvent e){}

void windowActivated(WindowEvent e){}

void windowDeactivated(WindowEvent e){}

}

public class MyFrame extends Frame{

public MyFrame(){

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

WindowHandler handler=new WindowHandler();

addWindowListener(handler);

setSize(150,100);

setVisible(true);

}

public static void main(String[] args){

MyFrame frame=new MyFrame();

}

}

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

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐