技术开发 频道

Java2的新焦点子系统

        AWT 焦点子系统的前一个发行版因其轻量级的或重量级的组件类型和拥有 Java 虚拟机平台的不一致行为而受挫。因为重量级的组件实施使用一个独立的本机窗口(AWT 组件),对于本机焦点系统它们是可信赖的。轻量级的(基于 Swing 的)组件在不同平台上的外观和感觉都相同。 KeyboardFocusManager 解决了这种不一致,确保了轻量级和重量级组件所有和焦点相关的动作和查询都成为可能。

  确定当前的焦点所有者和焦点窗口

  当前的焦点所有者是新的 AWT 焦点模型中的一个关键元素。所有遍历操作都从当前的焦点所有者或从另一个被虚拟的认作焦点所有者的组件开始。每个给定时间只能有一个当前的焦点所有者。当前的焦点所有者是个已收到 FOCUS_GAINED 事件 ― 但还未收到 FOCUS_LOST 事件的组件(有关这些事件的更多信息,请参阅下面的内容)。

  您使用 KeyboardFocusManager.getFocusOwner() 来确定当前的焦点所有者。如果该焦点所有者未和调用线程处于同一个上下文中,那么该方法会返回空。因此,您应该在代码中使用 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() 。这样,只有当焦点被设置成“无组件(no component)”时才会返回空。此外,该 Component 类提供了 isFocusOwner() 方法,如果该组件是焦点所有者,那么这个方法就返回真。

  同样,拥有焦点的窗口就是包含当前的焦点所有者的窗口。 KeyboardFocusManager.getFocusedWindow() 返回的拥有焦点的窗口和调用线程处在相同的上下文中。再说一遍,您应该使用 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow() 来确保该拥有焦点的窗口和调用线程处在相同的上下文中。

  确定焦点更改中的对立组件

  一些窗口和组件的焦点事件含有相应的对立事件。这样的事件集有:

  FOCUS_LOST 和 FOCUS_GAINED

  WINDOW_ACTIVATED 和 WINDOW_DEACTIVATED

  WINDOW_LOST_FOCUS 和 WINDOW_GET_FOCUS

  当调遣其中的一个事件时,总是同时调遣了这个事件的对立事件。焦点更改的对立组件只是个获取对立事件的组件。例如,当一个组件获得了焦点时,其对立组件就是那个失去该焦点的组件。

  FocusEvent.getOppositeComponent() 方法和 WindowEvent.getOppositeWindow() 方法返回焦点更改所涉及的对立组件或窗口。 上面列出的六个焦点事件和这两个方法密切相关。当一个窗口得到一个 WINDOW_DEACTIVATED 事件时, getOppositeWindow() 方法查找获取 WINDOW_ACTIVATED 事件的窗口。如果其对立组件或窗口处于一个不同的上下文,这些方法中每一个都会返回空。

0
相关文章