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が使用されます。
  • Layout
    • 以下のようにLayoutFocusTraversalPolicyのacceptメソッドをオーバーライドして、中央のJTextArea(編集可の場合でも)にだけは、タブキーなどでフォースが移らないようにしています。
      frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
        @Override protected boolean accept(Component c) {
          return (c==textarea)?false:super.accept(c);
        }
      });
      

参考リンク

コメント