Posted by terai at 2004-04-26
Focusの移動
FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。
サンプルコード
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キーを押していくと、東西南北の順でボタンのフォーカスが移動(Shift+Tabキーでは逆順)
- 4つのJButton以外には、Tabキーでフォーカスは移動しない
- Layout
- 以下のようにLayoutFocusTraversalPolicy*1のacceptメソッドをオーバーライドして、中央のJTextArea*2が編集不可の場合は、これにタブキーなどでフォースが移動しないように設定している
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*1のacceptメソッドをオーバーライドして、中央のJTextArea*2が編集不可の場合は、これにタブキーなどでフォースが移動しないように設定している
参考リンク
- The AWT Focus Subsystem
- Merlinの魔術: フォーカス、フォーカス、フォーカス
- Windowを開いたときのフォーカスを指定
- FocusTraversalKeysに矢印キーを追加してフォーカス移動