Swing/FocusTraversal のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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の移動
Posted by terai at 2004-04-26
Focusの移動
FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
final JButton nb = new JButton("NORTH");
final JButton sb = new JButton("SOUTH");
final JButton wb = new JButton("WEST");
final JButton eb = new JButton("EAST");
add(new JScrollPane(textarea));
add(nb, BorderLayout.NORTH);
add(sb, BorderLayout.SOUTH);
add(wb, BorderLayout.WEST);
add(eb, BorderLayout.EAST);
FocusTraversalPolicy policy = new FocusTraversalPolicy() {
//private final List<Component> order = Arrays.asList(
// new Component[] {eb, wb, sb, nb});
private final List<? extends Component> order = Arrays.asList(eb, wb, sb, nb);
@Override
public Component getFirstComponent(Container focusCycleRoot) {
return order.get(0);
}
@Override
public Component getLastComponent(Container focusCycleRoot) {
return order.get(order.size()-1);
}
@Override
public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
int i = order.indexOf(aComponent);
return order.get((i + 1) % order.size());
}
@Override
public Component getComponentBefore(Container focusCycleRoot, Component aComponent) {
int i = order.indexOf(aComponent);
return order.get((i - 1 + order.size()) % order.size());
}
@Override
public Component getDefaultComponent(Container focusCycleRoot) {
return order.get(0);
}
};
frame.setFocusTraversalPolicy(policy);
//setFocusTraversalPolicyProvider(true);
//setFocusTraversalPolicy(policy);
解説
上記のサンプルでは、FocusTraversalPolicyを使用することで、キー入力によるフォーカスの移動を制御しています。また、ラジオボタンで以下のようなFocusTraversalPolicyに切り替えることができます。
- Default
- JPanelのデフォルトは、null
- 実際のキー入力によるフォーカスの移動には、このパネルの親(frame)に設定されているFocusTraversalPolicyが使用される
- Custom
- Merlinの魔術: フォーカス、フォーカス、フォーカスからの引用
- Tabキー*1を押していくと、東西南北の順でボタンのフォーカスが移動
- 4つのJButton以外には、Tabキーでフォーカスは移動しない
- Layout
- 以下のようにLayoutFocusTraversalPolicy*2のacceptメソッドをオーバーライドして、中央のJTextArea*3が編集不可の場合は、これにタブキーなどでフォースが移動しないように設定している
frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() { @Override protected boolean accept(Component c) { if(c instanceof JTextComponent && !((JTextComponent)c).isEditable()) { return false; }else{ return super.accept(c); } //return (c==textarea)?false:super.accept(c); } });
- 以下のようにLayoutFocusTraversalPolicy*2のacceptメソッドをオーバーライドして、中央のJTextArea*3が編集不可の場合は、これにタブキーなどでフォースが移動しないように設定している
参考リンク
- The AWT Focus Subsystem
- Merlinの魔術: フォーカス、フォーカス、フォーカス
- Windowを開いたときのフォーカスを指定
- FocusTraversalKeysに矢印キーを追加してフォーカス移動