百度广告
最新的 Java 标准版,1.4 发行版中,Java 2 平台有了个全新的 AWT 焦点子系统,我们对此进行了独家报导。Java 语言工程师 Bertrand Portier 对新的类和方法进行了初步研究(包括基本的 KeyboardFocusManager),这些类和方法中包含该 AWT 焦点子系统。他还提供了迁移到新的 API 时调整编程工作的技巧,一个能工作代码样本示例及其它更多内容。请在讨论与和其它读者分享您关于的想法。
KeyboardFocusManager 类用于管理与新的 AWT 焦点子系统的焦点相关的任务。它负责活动的和已定焦的窗口以及当前的焦点所有者。它的任务是让客户机代码可以启动焦点的更改并调度与焦点相关的所有事件。
KeyboardFocusManager 给 AWT 焦点子系统带来许多新功能。其中的一些功能
用 Shift-Tab 将焦点转到 tab 组的前一个组件。
确定当前的焦点所有者。
BACKWARD_TRAVERSAL_KEYS:通常是 Shift+Tab(或 Ctrl-Shift-Tab)
DOWN_CYCLE_TRAVERSAL_KEYS:无缺省值 |||
KeyboardFocusManager 是个抽象类,我们能够用它全局的请求焦点信息。例如,KeyboardFocusManager.getFocusOwner() 返回当前的焦点所有者。DefaultKeyboardFocusManager 类对 AWT 应用程序是作为缺省提供的。您当然可以选用自己的 KeyboardFocusManager 类来替代该焦点模型。但是,倘若本机的焦点策略复杂的话,建议您还是建立 KeyboardFocusManager 或 DefaultKeyboardFocusManager 的子类吧。
AWT 焦点子系统的前一个发行版因其轻量级的或重量级的组件类型和拥有 Java 虚拟机平台的不一致行为而受挫。因为重量级的组件实施使用一个独立的本机窗口(AWT 组件),对于本机焦点系统它们是可信赖的。轻量级的(基于 Swing 的)组件在不同平台上的外观和感觉都相同。KeyboardFocusManager 解决了这种不一致,确保了轻量级和重量级组件所有和焦点相关的动作和查询都成为可能。
确定当前的焦点所有者和焦点窗口
一些窗口和组件的焦点事件含有相应的对立事件。这样的事件集有:
FOCUS_LOST 和 FOCUS_GAINED
WINDOW_LOST_FOCUS 和 WINDOW_GET_FOCUS
FocusEvent.getOppositeComponent() 方法和 WindowEvent.getOppositeWindow() 方法返回焦点更改所涉及的对立组件或窗口。 上面列出的六个焦点事件和这两个方法密切相关。当一个窗口得到一个 WINDOW_DEACTIVATED 事件时,getOppositeWindow() 方法查找获取 WINDOW_ACTIVATED 事件的窗口。如果其对立组件或窗口处于一个不同的上下文,这些方法中每一个都会返回空。 |||
通过编程来实现焦点遍历
focusNextComponent() 在遍历循环中把焦点传递给下一个组件。该方法可以把另一个组件作为它的参数,然后把焦点传递给焦点遍历循环中紧接着的那个组件。 focusPreviousComponent() 对于遍历循环中前一个组件的处理与之类似。
Container 一般既起到一个焦点遍历循环的成员的作用,也起到另一个焦点遍历循环的根的作用。这让我们理解了焦点遍历层次结构的概念,从而明白了向上和向下的焦点循环的概念。 upFocusCycle() 把焦点从当前的焦点所有者向上移动一个焦点遍历循环。它可以把一个组件作为它的参数,从而把焦点向上移动一个遍历循环到该组件的遍历循环。 downFocusCycle() 的处理方法相同,但只在组件是焦点遍历循环的根的情况下使用。
在下面的代码样本中,您可以看到一个框架包含了两个组件;调用这两个组件其中之一的 upFocusCycle() 会使框架获得焦点。请注意,如果没有可以定焦的其他组件,焦点所有者就不会改变。
通过调用 KeyboardFocusManager.clearGlobalFocusOwner(),您可以把焦点所有者设置成"无组件(no component)"。这导致了当前的焦点所有者的 FOCUS_LOST 事件。直到用户交互或代码明确地设置了焦点所有权为特殊的组件,才丢弃所有的键事件。这不仅对 Java 组件是有效的,对本机级别的组件也有效。
Componet 类、Container 类和 Windows 类中的新方法
Window.setFocusableWindow(boolean) 允许您通过程序来防止窗口或它的任何子组件成为焦点所有者。所有窗口在缺省情况下都是可定焦的,但在特定情况下需要把窗口设置成不可定焦。一个明显的示例是输入法合成窗口。输入法用来输入不能由标准 102 键键盘完全插入的文本字符。很明显,您希望焦点遍历循环不包括输入法合成窗口(如下所示),因此使用 Window.setFocusableWindow(false)。
图 1. Turbolinux 中文输入法合成窗口的屏幕截图
新的遍历策略类
点击加载更多评论>>