我们将用一个生动的代码样本来结束这篇文章。下面的清单中使用了文中描述的新的类和方法。 TextField 用焦点侦听者来演示焦点移动到该示例组件和从该组件移走时发生的变化。当您运行这个程序(压缩文件在 参考资料中)时,您能够看到 TextField 得到了最初的焦点。最后,在调用 clearGlobalFocusOwner() 后,任何组件都没有焦点了。
把本文中的描述和讨论以及下面这个示例一起作为学习这个新的 AWT 焦点子系统的出发点。请参阅 参考资料以获取相关文档和更深入的知识。
清单 1. 一个学术上的焦点管理示例
1 import java.awt.*;
2 import java.awt.event.*;
3 public class MerlinFocus extends Frame implements FocusListener {
4 DefaultKeyboardFocusManager myFocusmgr
5 = new DefaultKeyboardFocusManager();
6 Button bt;
7 TextField tf;
8 MerlinFocus() {
9 bt = new Button("myButton");
10 tf = new TextField("myTextField");
11 tf.addFocusListener(this);
12 setLayout(new GridLayout());
13 add(tf);
14 add(bt);
15 }
16 /* Focus Listeners */
17 public void focusLost(FocusEvent e) {
18 System.out.println("myTextField: Focus lost");
19 System.out.println("The opposite component "
20 + "in this focus traversal is "
21 + e.getOppositeComponent()+".");
22 }
23 public void focusGained(FocusEvent e) {
24 System.out.println("myTextField: Focus gained");
25 }
26 public void printDefaultSettings(DefaultKeyboardFocusManager fm) {
27 /* print the four default traversal keys */
28 System.out.println("Default keys "
29 + "for the DefaultFocusManager class:");
30 System.out.println(" FORWARD_TRAVERSAL_KEYS: "
31 + fm.getDefaultFocusTraversalKeys(
32 KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
33 System.out.println(" BACKWARD_TRAVERSAL_KEYS: "
34 + fm.getDefaultFocusTraversalKeys(
35 KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
36 System.out.println(" UP_CYCLE_TRAVERSAL_KEYS: "
37 + fm.getDefaultFocusTraversalKeys(
38 KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS));
39 System.out.println(" DOWN_CYCLE_TRAVERSAL_KEYS: "
40 + fm.getDefaultFocusTraversalKeys(
41 KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS));
42 }
43 public void changeFocusOwner(DefaultKeyboardFocusManager fm) {
44 /* programmatically change the focus owner */
45 System.out.println("The current focus owner is "
46 + fm.getFocusOwner());
47 System.out.println("The current focus cycle root is: "
48 + fm.getCurrentFocusCycleRoot());
49 System.out.println("forwarding focus to the next component...");
50 fm.focusNextComponent();
51 System.out.println("Now, the focus owner is "
52 + fm.getFocusOwner());
53 System.out.println("going up one focus cycle...");
54 fm.upFocusCycle();
55 System.out.println("Now, the focus owner is "
56 + fm.getFocusOwner());
57 System.out.println("going down one focus cycle...");
58 fm.downFocusCycle();
59 System.out.println("Now, the focus owner is "
60 + fm.getFocusOwner());
61 System.out.println("clearing the global focus owner ...");
62 fm.clearGlobalFocusOwner();
63 System.out.println("Now, the focus owner is "
64 + fm.getFocusOwner());
65 }
66 public static void main(String args[]) {
67 MerlinFocus mf = new MerlinFocus();
68 mf.setTitle("Merlin Focus");
69 mf.pack();
70 mf.setVisible(true);
71 mf.printDefaultSettings(mf.myFocusmgr);
72 mf.changeFocusOwner(mf.myFocusmgr);
73 }
74 }
75
2 import java.awt.event.*;
3 public class MerlinFocus extends Frame implements FocusListener {
4 DefaultKeyboardFocusManager myFocusmgr
5 = new DefaultKeyboardFocusManager();
6 Button bt;
7 TextField tf;
8 MerlinFocus() {
9 bt = new Button("myButton");
10 tf = new TextField("myTextField");
11 tf.addFocusListener(this);
12 setLayout(new GridLayout());
13 add(tf);
14 add(bt);
15 }
16 /* Focus Listeners */
17 public void focusLost(FocusEvent e) {
18 System.out.println("myTextField: Focus lost");
19 System.out.println("The opposite component "
20 + "in this focus traversal is "
21 + e.getOppositeComponent()+".");
22 }
23 public void focusGained(FocusEvent e) {
24 System.out.println("myTextField: Focus gained");
25 }
26 public void printDefaultSettings(DefaultKeyboardFocusManager fm) {
27 /* print the four default traversal keys */
28 System.out.println("Default keys "
29 + "for the DefaultFocusManager class:");
30 System.out.println(" FORWARD_TRAVERSAL_KEYS: "
31 + fm.getDefaultFocusTraversalKeys(
32 KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
33 System.out.println(" BACKWARD_TRAVERSAL_KEYS: "
34 + fm.getDefaultFocusTraversalKeys(
35 KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
36 System.out.println(" UP_CYCLE_TRAVERSAL_KEYS: "
37 + fm.getDefaultFocusTraversalKeys(
38 KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS));
39 System.out.println(" DOWN_CYCLE_TRAVERSAL_KEYS: "
40 + fm.getDefaultFocusTraversalKeys(
41 KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS));
42 }
43 public void changeFocusOwner(DefaultKeyboardFocusManager fm) {
44 /* programmatically change the focus owner */
45 System.out.println("The current focus owner is "
46 + fm.getFocusOwner());
47 System.out.println("The current focus cycle root is: "
48 + fm.getCurrentFocusCycleRoot());
49 System.out.println("forwarding focus to the next component...");
50 fm.focusNextComponent();
51 System.out.println("Now, the focus owner is "
52 + fm.getFocusOwner());
53 System.out.println("going up one focus cycle...");
54 fm.upFocusCycle();
55 System.out.println("Now, the focus owner is "
56 + fm.getFocusOwner());
57 System.out.println("going down one focus cycle...");
58 fm.downFocusCycle();
59 System.out.println("Now, the focus owner is "
60 + fm.getFocusOwner());
61 System.out.println("clearing the global focus owner ...");
62 fm.clearGlobalFocusOwner();
63 System.out.println("Now, the focus owner is "
64 + fm.getFocusOwner());
65 }
66 public static void main(String args[]) {
67 MerlinFocus mf = new MerlinFocus();
68 mf.setTitle("Merlin Focus");
69 mf.pack();
70 mf.setVisible(true);
71 mf.printDefaultSettings(mf.myFocusmgr);
72 mf.changeFocusOwner(mf.myFocusmgr);
73 }
74 }
75