background image

 
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 中文输入法合成窗口的屏幕截图