focusNextComponent() 在遍历循环中把焦点传递给下一个组件。该方法可以把另一个组件
作 为 它 的 参 数 , 然 后 把 焦 点 传 递 给 焦 点 遍 历 循 环 中 紧 接 着 的 那 个 组 件 。
focusPreviousComponent() 对于遍历循环中前一个组件的处理与之类似。
Container 一般既起到一个焦点遍历循环的成员的作用,也起到另一个焦点遍历循环
的根的作用。这让我们理解了焦点遍历层次结构的概念,从而明白了向上和向下的焦点循
环 的概念。upFocusCycle() 把焦点从当前的焦点所有者向上移动一个焦点遍历循环。它可
以把一个组件作为它的参数,从而把焦点向上移动一个遍历循环到该组件的遍历循环。
downFocusCycle() 的处理方法相同,但只在组件是焦点遍历循环的根的情况下使用。
在下面的 代码样本中,您可以看到一个框架包含了两个组件;调用这两个组件其中之
一的 upFocusCycle() 会使框架获得焦点。请注意,如果没有可以定焦的其他组件,焦点所
有者就不会改变。
通过调用 KeyboardFocusManager.clearGlobalFocusOwner() ,您可以把焦点所有者设
“
置成 无组件(no component)”
。这导致了当前的焦点所有者的 FOCUS_LOST 事件。直到用
户交互或代码明确地设置了焦点所有权为特殊的组件,才丢弃所有的键事件。这不仅对
Java 组件是有效的,对本机级别的组件也有效。
Componet 类、Container
类和 Windows 类中的新方法
在 Merlin
的 Component
和 Container 类中,已经添加了新的与焦点相关的方法。您可
以把他们作为 KeyboardFocusManager 方法的备用方法使用它们,从而设置或获取这些类
的实例的焦点属性。例如, Component.isFocusable() 传达了组件是否可以定焦。所有组件缺
省的返回值都为真,因为所有组件在缺省情况下都是可定焦的。这不同于前几个发行版
― 轻量级组件缺省情况下不可定焦。Component.setFocusable(boolean) 设置组件是否可定
焦。
setFocusable(false)
会导致随后调用 requestFocus()
和 requestFocusInWindow() 的失败。
请注意, Component
类和 Container
类的一些方法和 KeyboardFocusManager 中的一些方
法有相同的功能并且是等价的。例如, Component.setFocusTraversalKeys() 可以用来覆盖一
个 应 用 程 序 中 特 定 组 件 的 遍 历 键 , 该 应 用 程 序 有 它 自 己 的 策 略 和 由
KeyboardFocusManager.setDefaultFocusTraversalKeys() 定义的焦点遍历键集。
Window.setFocusableWindow(boolean) 允许您通过程序来防止窗口或它的任何子组件
成为焦点所有者。所有窗口在缺省情况下都是可定焦的,但在特定情况下需要把窗口设置
成不可定焦。一个明显的示例 是输入法合成窗口。输入法用来输入不能由标准 102 键键盘
完全插入的文本字符。很明显,您希望焦点遍历循环不包括输入法合成窗口(如下所示),
因此使用 Window.setFocusableWindow(false) 。
图 1. Turbolinux 中文输入法合成窗口的屏幕截图