快速业务通道

Merlin的魔力: 焦点,焦点,还是焦点 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
t() 和 getLastComponent() 方法时,您应该在脑海里有第一/最后组件这样一个概念,但是初始组件未必就是第一组件,这些方法允许您显式地设置哪个组件是第一组件,哪个组件又是最后组件。

Merlin的魔力: 焦点,焦点,还是焦点(2)

时间:2011-02-02 IBM John Zukowski

内建策略

该系统包括5种内建的焦点遍历策略,其中后3种策略是特定于Swing的:

ContainerOrderFocusTraversalPolicy

DefaultFocusTraversalPolicy

InternalFrameFocusTraversalPolicy

SortingFocusTraversalPolicy

LayoutFocusTraversalPolicy

ContainerOrderFocusTraversalPolicy 通过使用容器固有的组件排序方式(它的 getComponents() 数组)来工作,这个顺序通常就是将组件添加到容器中时的顺序――除非您是用 add() 方法将组件添加到特定的位置的。除了 FocusTraversalPolicy 的这6个方法, ContainerOrderFocusTraversalPolicy 还支持隐式地将焦点向下转移到一个容器中,并提供了一个 accept() 方法,您可以重载这个方法,以便定义对于一个要获得焦点的组件来说什么是可接受的选择。

DefaultFocusTraversalPolicy 的工作方式与 ContainerOrderFocusTraversalPolicy 非常相似,只有一点不同――它依赖于AWT的对等组件来检查一个组件是否能够获得焦点。对等组件的可聚焦性(focusability)是依赖于实现的,因此您又要回过头来面对现有焦点管理子系统所存在的问题。而当您使用Swing GUI组件时,就不必担心对等组件的可聚焦性。

InternalFrameFocusTraversalPolicy 是为 JInternalFrame 而提供的策略。假设 JInternalFrame 不是重量级的窗口,那么当它初次显示时需要处理一些特有的行为。

SortingFocusTraversalPolicy 允许您定义一个 Comparator 来控制焦点遍历策略。这里是创建一个 comparator 来处理排序方式,而不是使用大块的 if-else语句块或者 Map 查找 。

还有一个专门的 SortingFocusTraversalPolicy ,它提供了一个默认的Comparator: LayoutFocusTraversalPolicy 。这里,组件是按照大小、位置和方位来排序的,而不是按照 getComponents() 数组中的顺序排序的。

这里也提供了第六个策略: LegacyGlueFocusTraversalPolicy ,但它不是公共的。当旧式的代码使用像 JComponent.setNextFocusableComponent() 这样的方法时,就会使用这个策略。

一个可以运行的实例

接下来,我们将创建一个简单的实例,用这个实例来演示对我们自己的焦点遍历策略的使用。我们将创建一个 FocusTraversalPolicy 实现,该实现带有一个数组,并按照数组中组件的顺序来决定焦点遍历的顺序。示例窗口采用的是典型的 BorderLayout 样式,在这种样式下,组件按照North、South、East、West和Center来定位和显示。遍历顺序是先按顺时针方向访问外围的组件,然后再访问中间的组件。图 1 展示了这个程序:

图 1. 一个BorderLayout窗口

Merlin的魔力: 焦点,焦点,还是焦点 - 编程入门网

Merlin的魔力: 焦点,焦点,还是焦点(3)

时间:2011-02-02 IBM John Zukowski

清单 1 显示了完整的顺时针遍历清单:

清单 1. 顺时针遍历

import java.awt.*; import javax.swing.*; import java.util.Arrays; import java.util.Comparator; import java.util.List; public class BorderFocus {   public static void main(String args[]) {    JFrame frame = new JFrame("Focus Cycling");    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    Container contentPane = frame.getContentPane();    JButton north = new JButton("North");    contentPane.add(north, BorderLayout.NORTH);    JButton south = new JButton("South");    contentPane.add(south

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号