Swing/FocusTraversal のバックアップ(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FocusTraversal へ行く。
- 1 (2007-07-26 (木) 14:38:58)
- 2 (2007-12-21 (金) 18:36:24)
- 3 (2008-04-08 (火) 18:58:33)
- 4 (2008-04-09 (水) 18:12:46)
- 5 (2008-04-18 (金) 19:09:54)
- 6 (2008-05-15 (木) 20:20:25)
- 7 (2008-05-21 (水) 20:38:40)
- 8 (2008-06-03 (火) 18:43:18)
- 9 (2008-06-18 (水) 12:38:08)
- 10 (2008-06-26 (木) 14:17:21)
- 11 (2009-03-16 (月) 17:05:15)
- 12 (2010-02-05 (金) 18:37:59)
- 13 (2010-02-06 (土) 04:07:51)
- 14 (2010-03-12 (金) 14:18:41)
- 15 (2013-04-07 (日) 04:48:13)
- 16 (2013-07-26 (金) 01:18:29)
- 17 (2013-08-20 (火) 14:24:00)
- 18 (2014-05-21 (水) 21:26:47)
- 19 (2014-05-22 (木) 13:57:37)
- 20 (2014-06-04 (水) 22:12:32)
- 21 (2014-11-05 (水) 05:02:23)
- 22 (2015-12-04 (金) 18:07:19)
- 23 (2016-09-14 (水) 18:09:24)
- 24 (2017-10-27 (金) 13:32:59)
- 25 (2017-11-02 (木) 15:29:16)
- 26 (2018-10-02 (火) 13:55:59)
- 27 (2020-10-01 (木) 18:17:54)
- 28 (2022-06-11 (土) 15:36:04)
TITLE:Focusの移動
Focusの移動
Posted by terai at 2004-04-26
概要
FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
JButton nb = new JButton("NORTH");
JButton sb = new JButton("SOUTH");
JButton wb = new JButton("WEST");
JButton eb = new JButton("EAST");
add(new JScrollPane(field), BorderLayout.CENTER);
add(nb, BorderLayout.NORTH);
add(sb, BorderLayout.SOUTH);
add(wb, BorderLayout.WEST);
add(eb, BorderLayout.EAST);
final Component[] order = new Component[]{eb, wb, sb, nb};
FocusTraversalPolicy policy = new FocusTraversalPolicy() {
java.util.List list = Arrays.asList(order);
public Component getFirstComponent(Container focusCycleRoot) {
return order[0];
}
public Component getLastComponent(Container focusCycleRoot) {
return order[order.length-1];
}
public Component getComponentAfter(Container fcr, Component cmp) {
int index = list.indexOf(cmp);
return order[(index + 1) % order.length];
}
public Component getComponentBefore(Container fcr, Component cmp) {
int index = list.indexOf(cmp);
return order[(index - 1 + order.length) % order.length];
}
public Component getDefaultComponent(Container focusCycleRoot) {
return order[0];
}
};
frame.setFocusTraversalPolicy(policy);
//setFocusTraversalPolicyProvider(true);
//setFocusTraversalPolicy(policy);
解説
上記のサンプルでは、FocusTraversalPolicyを使用することで、キー入力によるフォーカスの移動を制御しています。
また、パネル(this)を、Container#setFocusTraversalPolicyProvider(true)とし、ラジオボタンで以下のようなFocusTraversalPolicyに切り替えることができます。
- Default
- パネル(this)から取得しているので、nullです。
- 実際のキー入力によるフォーカスの移動には、親(frame)のFocusTraversalPolicyが使用されます。
- Custom
- Merlinの魔術: フォーカス、フォーカス、フォーカスからの引用です。
- Tabキー*1を押していくと、東西南北の順でボタンのフォーカスが移動します。
- 4つのJButton以外には、Tabキーでフォーカスは移動しません。
- Layout
- 以下のようにLayoutFocusTraversalPolicyのacceptメソッドをオーバーライドして、中央のJTextArea(編集可の場合でも)にだけは、タブキーなどでフォースが移らないようにしています。
frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() { @Override protected boolean accept(Component c) { return (c==textarea)?false:super.accept(c); } });
- 以下のようにLayoutFocusTraversalPolicyのacceptメソッドをオーバーライドして、中央のJTextArea(編集可の場合でも)にだけは、タブキーなどでフォースが移らないようにしています。