2024年5月16日发(作者:)
本文作者:黄邦勇帅
本文主要介绍java1.4版本的焦点部题,全文共4章,第一章重点介绍焦点遍历策略,同时举了一个自定义实现焦点遍
历策略的示例。第2章介绍有关焦点管理的方法和类,第3章介绍焦点遍历循环的问题,本章对焦点中的几个比较难
于理解的概念焦点遍历循环,焦点遍历循环根,向上/下焦点遍历循环,作了深入的讨论,并且还列举了一个示例进行
验证。
本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。
声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。
主要参考文献:
JFC核心编程第2版[英]Kim Topley著郭旭朱浩斌吴宇文译清华大学出版社出版2003年7月
JavaTM 2 Platform Standard Edition 6 API 开发人员文档
第1章:焦点遍历策略
(焦点传输的算法问题)
(共4章,共13页)
专有名词解释:
1、可聚焦性:即组件是否可以获得焦点,如Label组件是不能获得焦点的,但可以通过usable(boolean)
方法使Label能够获得焦点。同位体的可聚焦性是与实现有关的,对Windows和Unix的建义是,Canvases, Labels,
Panels等和轻量级组件都是不可聚焦的同位体,而其他所有的组件都具有可聚焦的同位体。
2、焦点遍历循环根:其实就是一个容器,可以将任意容器设置为焦点遍历循环根,只不过当焦点在来回转移时,这个
焦点将一直呆在焦点循环根内的一个循环之中。比如可以将JPanel设置为一个焦点遍历循环根。
3、焦点遍历循环:一般在使用TAB传递焦点时焦点都是在一系列组件之间来回循环的传递,这就是焦点遍历循环。
比如有组件jb1, jb2, jb3, jb4,这时焦点的传递次序可以是jb1, jb2, jb3, jb4,jb1,,当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类,则主要负责管理焦点所有者,比如,确定当前的焦点所有者和焦点窗口,它的任务是让
客户机代码可以启动焦点的更改并调度与焦点相关的所有事件。
三、raversalPolicy焦点遍历策略抽象类
1、FocusTraversalPolicy定义了一种顺序,按此顺序遍历具有特定焦点循环根的组件,该抽象类的主要作用是提供一种
算法,使其在我们按下Tab或Shift-Tab进行向前或向后遍历时,确定下一个或上一个将获得焦点的组件。
2、原型为:public abstract class FocusTraversalPolicy extneds Object
3、直接子类:ContainerOrderFocusTraversalPolicy, InternalFrameFocusTraversalPolicy
4、构造方法为:只有一个默认构造方法
5、方法有(共6个):
abstract Component getComponentAfter(Container cn, Component cm);反回cm之后应该接收焦点的组件,cn必须是cm
的焦点循环根或者焦点遍历策略提供者,若无法找到合适的组件,则反回null
abstract Component getComponentBefore(Container cn, Component cm);反回cm之前应该接收焦点的组件,cn必须是cm
的焦点循环根或者焦点遍历策略提供者,若无法找到合适的组件,则反回null。
abstract Component getDefaultComponent(Container cn);反回要聚焦的默认组件,在向下遍历到以cn为根的新的焦点遍
历循环时(焦点循环根参见后面的内容),反回的Component将是第一个接受焦点的组件。若无法找到合
适的组件,则反回null。
abstract ComponentgetFirstComponent(Container cn);反回遍历循环中的第一个组件,若无法找到合适的组件,则反回
null。
Component getInitialComponent(Window w);反回第一次将窗口设为可见时,应该接收焦点的组件,若无法找到合
适的组件,则反回null。一旦通过调用show() 或setVisible(true) 将窗口设置为可见后,将不再使用初始
Component。相反,如果窗口失去焦点、随后又重获焦点,或者设置为不可见或不可显示、随后又设置为
可见或可显示,则窗口最近聚焦的Component 将成为焦点所有者。此方法的默认实现返回默认
Component,即getDefaultComponent方法反回的组件。
abstract Component getLastComponent(Container cn);反回遍历循环中的最后一个组件。若无法找到合适的组件,则反
回null。
四、五种内建策略
1、ContainerOrderFocusTraversalPolicy位于包之中,根据容器中的组件的顺序来确定遍历顺序的焦点遍历
策略,这个顺序通常就是将组件添加到容器中的顺序。该策略支持隐式的将焦点向下转移到一个容器中,并提供了
一个accept()方法,该方法用于确定是否可以接受选择某个组件作为新的焦点拥有者。
2、DefaultFocusTraversalPolicy位于包之中,这是所有AWT容器的默认焦点遍历策略,该策略与
ContainerOrderFocusTraversalPolicy基本相同,都是按照组件添加到容器中的顺序来遍历焦点的,唯一的不同是
DefaultFocusTraversalPolicy是依赖于AWT的对等组件来检测一个组件是否能够获得焦点。而当使用Swing组件时,
就不必担心对等组件的可聚焦性。
3、InternalFrameFocusTraversalPolicy位于包中,这是为JInternalFrame(内部窗体)提供的策略,该策
略可以有选择地提供确定JInternalFrame初始组件的算法,初始组件是第一次选择JInternalFrame时接收焦点的第一
个组件,默认情况下,此组件是InternalFrame默认要聚焦的组件。
4、SortingFocusTraversalPolicy位于包中,组件按给定的Comparator(比较器)排序来确定遍历顺序。默
认情况下,该策略会隐式的将焦点传输给下一个循环。
5、LayoutFocusTraversalPolicy位于包中,swing布局默认使用的策略,根据组件的大小、位置和方向
对其进行排序焦点遍历策略。对于水平方向的容器,列的排序是从左到右或从右到左,行的排列顺序是从顶端到底
部;对于垂直方向的容器,列的排序是从顶端到底部,行的排顺是从左到右或从右到左。在遍历完一行中的所有列
之后才继续到下一行。此策略中组件的切换顺序是基于容器的直观布局,而与组件添加到容器的次序无关。焦点管
理器会比较容器中的每一对组件,考察其X轴和Y轴坐标。若Y轴坐标是“闭”的,则会基于X轴坐标对组件排
序,因此这时具有较小X轴坐标的组件会优先得到焦点;若Y轴坐标不是闭的,则焦点会基于Y轴坐标进行,这
时具有较小Y轴坐标的组件会优先得到焦点。简单地说,就是在同一行上的组件次序是从左到右,但在较低的行之
前,在较高的行之后;也就是行与行之间,较高的行首先具有从左到右的焦点,然后再从较低的行从左到右。
五、初始和默认焦点问题
1、初始焦点:就是当窗口第1次可见时应该接收焦点的组件,默认情况下初始焦点的实现就是反回默认的焦点。
2、默认焦点:在一个焦点循环根(就是一个容器,具体参见稍后的内容)中,当我们在遍历到此循环根中时,此循环中
第一个接受焦点的组件。
3、初始焦点和默认焦点都是由各自的焦点遍历策略决定的,若我们使用的是系统提供的5种内建策略之一,则初始和
默认焦点已由这5种策略设置好了,若要改变初始和默认焦点就是继承自他们,然后重写其中的
getDefaultComponent(Container cn)和getInitialComponent(Window w)方法,来改变其默认和初始焦点。
//使用FocusTraversalPolicy实现自定义的焦点遍历循环策略示例
import
import
import
import
.*;
.*;
.*;
.*;
publicclassA2{
JButtonjb1=newJButton("按钮1");JButton
JButtonjb3=newJButton("按钮3");JButton
JButtonjb5=newJButton("按钮5");JButton
JButtonjb7=newJButton("按钮7");JButton
JTextFieldjtf1=newJTextField("wwww");
JPaneljp1=newJPanel();
jb2=new
jb4=new
jb6=new
jb8=new
JButton("按钮2");
JButton("按钮4");
JButton("按钮6");
JButton("按钮8");
JFramejf=newJFrame();JPaneljp2=newJPanel();
A2(){
out(newFlowLayout());
发布者:admin,转转请注明出处:http://www.yc00.com/web/1715815091a2675871.html
评论列表(0条)