技术开发 频道

为可访问性编码

  通常 Swing 允许用跳格(Tab)、反向跳格和箭头键进行键盘导航。遗憾的是,这个系统难以实现并且很费时,因为它要求用户导航所有中间组件才能到达它需要的那个组件。对于更有效的键盘导航,用户应该能够迅速地在重要组件之间切换,而无须考虑它们在 GUI 布局中的顺序。我们可以将助记符键盘设置用于 javax.swing.AbstractButton 和 javax.swing.JLabel 的子类以及应用程序菜单中的项。助记符通常称为 加速键,因为它们根据 GUI 内容直接进行工作。

  在为您的界面建立了助记符系统之后,用户就可以通过使用 Alt 键和键盘上表示该组件的助记符键(Alt+键)导航到任何想用的组件上。但是这种设置有一个问题,就是它对于优异组件(通常是 JFrame 或 JDialog )而言是全局的。这意味着基本上只有 26 个唯一值,却要分配给所有菜单和菜单项以及基本的 GUI 内容。在频繁使用的 GUI 上并非所有组件都可以链接到助记符键,因此您必须确定哪些组件对于用户是最重要的,然后相应的设置它们。我建议您为菜单项、重要的操作按钮(如 OK 或 Cancel)和 GUI 中每个逻辑组中的初始组件创建助记符链接,然后让用户跳格到其它每个组件上。

  设置跳格顺序和初始焦点

  对于大多数基于跳格的逻辑导航,我建议您将组件按您希望跳格选择的顺序添加到容器中。您可能希望以相同的方式组织嵌套的容器(即 JPanel )。尽管从上到下、从左向右(T2B、L2R)的顺序是标准的,但您可能希望建立不同的系统,如基于列排列的系统。您可以使用方法 JComponent.setNextFocusableComponent(Component c) (或 Java 1.4 中的类 java.awt.FocusTraversalPolicy )来强制规定定制的跳格顺序。 AccessibilityDemo1 GUI说明了一个跳格系统,该系统基于将组件以 T2B、L2R 顺序添加到容器中。

  在定义了跳格顺序之后,您需要确保每个初始组件都在选中其容器时接收到焦点。当容器接收到焦点时(请参阅 参考资料以获取关于 FocusListener 的更多信息),它应该向期望的初始组件发出 java.awt.Component.requestFocus() (在 Java 1.4 中是 java.awt.Component.requestFocusInWindow() )。

  另一种方法是在窗口激活时设置初始焦点。例如,下列代码将 WindowListener 添加到 JFrame ,后者在窗口被激活时为 JTextField 请求焦点。

  清单 3. 在激活时设置初始焦点

1 import java.awt.event.*;
2 import javax.swing.*;
3      :
4 JFrame frame = new JFrame();
5 JTextField field = new JTextField();  /// field to get initial focus
6 boolean focusSet;
7      :
8 frame.addWindowListener(new WindowAdapter() {
9       public void windowActivate() {
10          if ( !focusSet ) {
11              field.requestFocus();
12              focusSet = true;
13          }
14       }
15 }
16

  如果您希望将初始焦点设置到按钮而不是 JTextField ,则可以设置 DefaultButton 字段,如下所示:

  清单 4. 设置 DefaultButton 字段

1 import java.awt.event.*;
2 import javax.swing.*;
3      :
4 JFrame frame = new JFrame();
5 JButton button = new JButton();
6      :
7 panel.add(button);
8      :
9 frame.getRootPane().setDefaultButton(button);
10

  您只需设置初始焦点一次,因为 Swing 始终会将焦点恢复到初始的设置。

0
相关文章