java图形编程:java焦点管理专题
本文作者:黄邦勇帅
本文主要介绍 java1.4版本的焦点部题,全文共 4章,第一章重点介绍焦点遍历策略,同时举了一个自定义实现焦点遍
历策略的示例。第 2章介绍有关焦点管理的方法和类,第 3章介绍焦点遍历循环的问题,本章对焦点中的几个比较难
于理解的概念焦点遍历循环,焦点遍历循环根,向上/下焦点遍历循环,作了深入的讨论,并且还列举了一个示例进行
验证。
本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。
声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。
主要参考文献:
JFC核心编程 第 2版 [英]Kim Topley著 郭旭 朱浩斌 吴宇文译 清华大学出版社出版 2003年 7月
JavaTM 2 Platform Standard Edition 6 API 开发人员文档
第 1章:焦点遍历策略(焦点传输的算法问题)
(共 4章,共 13页)
专有名词解释:
1、可聚焦性:即组件是否可以获得焦点,如 Label组件是不能获得焦点的,但可以通过Component.setFocusable(boolean)
方法使 Label能够获得焦点。同位体的可聚焦性是与实现有关的,对Windows和Unix的建义是,Canvases, Labels,
Panels等和轻量级组件都是不可聚焦的同位体,而其他所有的组件都具有可聚焦的同位体。
2、焦点遍历循环根:其实就是一个容器,可以将任意容器设置为焦点遍历循环根,只不过当焦点在来回转移时,这个
焦点将一直呆在焦点循环根内的一个循环之中。比如可以将 JPanel设置为一个焦点遍历循环根。
3、焦点遍历循环:一般在使用 TAB 传递焦点时焦点都是在一系列组件之间来回循环的传递,这就是焦点遍历循环。
比如有组件 jb1, jb2, jb3, jb4,这时焦点的传递次序可以是 jb1, jb2, jb3, jb4,jb1,jb2....,当 jb4获得焦点后可以再传
回到 jb1,如此产生一个循环,这就是焦点遍历循环,焦点具体怎样传递这取决于焦点遍历策略的算法。
4、向上/下焦点遍历循环:就是将焦点从一个循环传递到另一个焦点循环。一个焦点遍历循环只属于一个焦点遍历循
环根,因此向上/下焦点遍历循环,其实就是将焦点从一个焦点遍历循环根传递到另一个焦点遍历循环根。
一、焦点的切换顺序
1、我们可以使用制表键(即 TAB键)来使焦点移至下一个组件,使用 Shift-Tab使焦点移至前一个组件。
2、在AWT中,组件焦点的切换顺序一般就是组件添加到容器的顺序。
3、在 jav1.4版本 Swing组件的默认焦点传输策略中,组件的切换顺序是基于容器的直观布局,而与组件添加到容器的
次序无关。Swing焦点管理器会比较容器中的每一对组件,考察其 X轴和 Y轴坐标。若 Y轴坐标是“闭”的,则
会基于X轴坐标对组件排序,因此这时具有较小X轴坐标的组件会优先得到焦点;若Y轴坐标不是闭的,则焦点
会基于 Y轴坐标进行,这时具有较小 Y轴坐标的组件会优先得到焦点。简单地说,就是在同一行上的组件次序是
从左到右,但在较低的行之前,在较高的行之后;也就是行与行之间,较高的行首先具有从左到右的焦点,然后再
从较低的行从左到右。
二、java1.4版的焦点控制(也称Merlin)
1.4 版的焦点系统相当庞大,本文只着重介绍 FocusTraversalPolicy 焦点遍历策略类,简要介绍 KeyboardFocusManager
键盘焦点管理类,这两个类都是抽象类,其中 FocusTraversalPolicy类定义了焦点按照什么顺序在组件之间进行遍历,
而KeyboardFocusManager类,则主要负责管理焦点所有者,比如,确定当前的焦点所有者和焦点窗口,它的任务是让
客户机代码可以启动焦点的更改并调度与焦点相关的所有事件。
三、java.awt.FocusTraversalPolicy焦点遍历策略抽象类
1、FocusTraversalPolicy定义了一种顺序,按此顺序遍历具有特定焦点循环根的组件,该抽象类的主要作用是提供一种
算法,使其在我们按下 Tab或 Shift-Tab进行向前或向后遍历时,确定下一个或上一个将获得焦点的组件。
2、原型为:public abstract class FocusTraversalPolicy extneds Object
3、直接子类:ContainerOrderFocusTraversalPolicy, InternalFrameFocusTraversalPolicy
4、构造方法为:只有一个默认构造方法
5、方法有(共 6个):
abstract Component getComponentAfter