Java基础-组件及事件处理(中)
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
BorderLayout布局管理器
说明:
示例:
FlowLayout布局管理器
说明:
示例:
GridLayout布局管理器
说明:
示例:
事件处理机制
什么是事件?
事件的类型
什么是事件处理?
事件处理所涉及的步骤
回调方法
Swing常用事件处理
SWING 事件类
EventObject 类
类声明
字段
类构造函数
类方法
BorderLayout布局管理器
说明:
BorderLayout 将容器分为 EAST 、 SOUTH 、 WEST 、 NORTH 、 CENTER五个区域,普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示
向BorderLayouti布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法。
参数comp表示要添加的组件,constraints指定将组件添加到布局中的位置,它是一个Object类型。
传参时可以使用BorderLayout类提供的5个常量设置组件位置,它们分别是EAST 、 SOUTH 、 WEST 、 NORTH 、 CENTERBorderLayout的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。
向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,默从添加到CENTER区域。
每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。
示例:
import java.awt.*; public class BorderLayoutDemo1 { public static void main(String[] args) { //1.创建Frame对象 Frame frame = new Frame("这里测试BorderLayout"); //2.指定Frame对象的布局管理器为BorderLayout frame.setLayout(new BorderLayout(30,5)); //3.往Frame指定东南西北中各添加一个按钮组件 frame.add(new Button("东侧按钮"), BorderLayout.EAST); frame.add(new Button("西侧按钮"), BorderLayout.WEST); frame.add(new Button("南侧按钮"), BorderLayout.SOUTH); frame.add(new Button("北侧按钮"), BorderLayout.NORTH); frame.add(new Button("中间按钮"), BorderLayout.CENTER); //4.设置Frame为最佳大小 frame.pack(); //5.设置Frame可见 frame.setVisible(true); } }
FlowLayout布局管理器
说明:
FlowLayout(流式布局管理器)是最简单的布局管理器。
在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。
这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列。参数ag决定组件在每行中相对于容器边界的对齐方式,分别为左对齐、右对齐、居中对齐。
对齐方式可以使用该类中提供的常量FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout..CENTER表示。
参数hgap和参数vgap分别设定组件之间的水平和垂直间距,可以填入一个任意数值。
示例:
import java.awt.*;
public class FlowLayoutDemo {
public static void main(String[] args) {
//1.创建Frame对象
Frame frame = new Frame("这里测试FlowLayout");
//2.修改Frame容器的布局管理器为FlowLayout
frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));
//3.往Frame中添加100个button
for (int i = 0; i < 100; i++) {
frame.add(new Button("按钮"+i));
}
//4.设置Frame为最佳大小
frame.pack();
//5.设置Frame可见
frame.setVisible(true);
}
}
GridLayout布局管理器
说明:
GridLayout 布局管理器将容器分割成纵横线分隔的网格 , 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时, 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLayout不同的是,放置在 GridLayout 布局管理器中的各组件的大小由组件所处的区域决定(每 个组件将自动占满整个区域) 。
GridBagLayout 布局管理器的功能最强大 , 但也最复杂,与 GridLayout 布局管理器不同的是, 在GridBagLayout 布局管理器中,一个组件可以跨越一个或多个网格 , 并可以设置各网格的大小互不相同,从而增加了布局的灵活性 。 当窗口的大小发生变化时 , GridBagLayout 布局管理器也可以准确地控制窗口各部分的拉伸 。
由于在GridBagLayout 布局中,每个组件可以占用多个网格,此时,我们往容器中添加组件的时候,就需要具体的控制每个组件占用多少个网格,java提供的GridBagConstaints类,与特定的组件绑定,可以完成具体大小和跨越性的设置。
示例:
import java.awt.*;
public class GridLayoutDemo{
public static void main(String[] args) {
//1.创建Frame对象,并且标题设置为计算器
Frame frame = new Frame("计算器");
//2.创建一个Panel对象,并且往Panel中放置一个TextField组件
Panel p1 = new Panel();
p1.add(new TextField(30));
//3.把上述的Panel放入到Frame的北侧区域
frame.add(p1,BorderLayout.NORTH);
//4.创建一个Panel对象,并且设置其布局管理器为GridLayout
Panel p2 = new Panel();
p2.setLayout(new GridLayout(3,5,4,4));
//5.往上述Panel中,放置15个按钮,内容依次是:0,1,2,3,4,5,6,7,8,9,+,-,*,/,.
for (int i = 0; i < 10; i++) {
p2.add(new Button(i+""));
}
p2.add(new Button("+"));
p2.add(new Button("-"));
p2.add(new Button("*"));
p2.add(new Button("/"));
p2.add(new Button("."));
//6.把上述Panel添加到Frame的中间区域中国
frame.add(p2);
//7.设置Frame为最佳大小
frame.pack();
//8.设置Frame可见
frame.setVisible(true);
}
}
事件处理机制
什么是事件?
改变对象的状态被称为事件,即事件描述源的状态变化。事件产生用户与图形用户界面组件交互的结果。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目,滚动页面都是导致一个事件发生的活动。
事件的类型
事件可以大致分为两类::
前台事件 - 这些事件需要用户的直接互动。它们是由在图形用户界面中人与图形组件交互的结果而产生的。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目,滚动页面等。
后台事件 - 这些事件需要最终用户的交互,它们被称为后台事件。操作系统的中断,硬件或软件故障,计时器过期,操作完成都是后台事件的例子
什么是事件处理?
事件处理是一种机制,如果一个事件发生时,它控制该事件,并且决定应该会发生什么。这种机制具有被称为事件处理程序的代码,当一个事件发生时,它是可执行的。Java 使用代理事件模型来处理事件。该模型定义了标准的机制来生成和处理事件。让我们来简要介绍这个模型。
代理事件模型具有下列主要参与者,即:
源 - 源是一个对象,事件发生在该对象上。源负责提供发生事件的信息给它的处理器。Java 提供源对象的类。
监听器 - 它也被称为作为事件处理。监听器负责产生对一个事件的响应。从 Java 实现的角度来看,监听器也是一个对象。监听器等待直到它接收到一个事件。一旦收到该事件,监听器进程的事件就返回。
这种方法的好处是,用户界面逻辑完全从生成事件的逻辑中分开。用户界面元素能够把事件的处理委派给一段单独的代码。在这个模型中,监听器需要用源对象注册,以便监听器能够接收事件通知。这是一个有效的处理事件的方式,因为这些事件通知只发送给那些想要接收它们的监听器。
事件处理所涉及的步骤
用户单击按钮,然后生成事件。
现在有关事件类的对象是自动创建的,源和事件的信息在同一对象得到填充。
事件对象被转发到注册监听器类的方法中。
该方法现在得到执行并且返回。
有关监听器要记住的要点:
为了设计一个监听器类,我们必须开发一些监听器接口。这些监听器接口预测一些公共的抽象回调方法,这些方法必须由监听器类来实现。
如果你没有实现任何预定义的接口,那么你的类不能作为源对象的监听器类。
回调方法
这些方法由 API 提供者来提供,由应用程序员来定义,并且由应用程序开发者来调用。这里的回调方法代表一个事件方法。响应一个事件 java jre 将触发回调方法。所有这些回调方法在监听器接口中被提供。
如果一个组件需要一些监听器监听它的事件,源必须自己注册给监听器。
Swing常用事件处理
SWING 事件类
事件类代表事件。Java 提供各种事件类,但是我们将讨论更频繁使用的那些事件类。
EventObject 类
它是派生所有事件状态对象的根类。所有事件都是用对象,源的引用来构造的,即逻辑上认为是问题最初发生的事件的对象。这个类定义在 java.util 包中。
类声明
下面是 java.util.EventObject 类的声明:
public class EventObject
extends Object
implements Serializable
字段
下面是 java.util.EventObject 类的字段:
-
protected Object source –- 事件最初发生的对象。