技术开发 频道

Java2的新焦点子系统

        正如 AWT 焦点子系统规范中所定义的,一个 焦点遍历循环是一组被定义过的组件,组中的每个组件(组外没有组件)会在前序或后序焦点遍历中被遍历到。

  焦点遍历循环中每个组件都有自己的上一个组件和下一个组件。 KeyboardFocusManager 类提供了在给定的遍历循环中传递焦点,或者甚至更改焦点遍历循环的方法。

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

0
相关文章