TITLE:Focusの移動
#navi(../)
*Focusの移動 [#x8547c84]
Posted by [[terai]] at 2004-04-26

#contents

**概要 [#b257f3c8]
FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#le272dee]
#code{{
JButton nb = new JButton("NORTH");
JButton sb = new JButton("SOUTH");
JButton wb = new JButton("WEST");
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);
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);
}}

**解説 [#h3d0848b]
上記のサンプルでは、FocusTraversalPolicyを使用することで、キー入力によるフォーカスの移動を制御しています。また、ラジオボタンで以下のようなFocusTraversalPolicyに切り替えることができます。

- Default
-- JPanelのデフォルトは、null
-- 実際のキー入力によるフォーカスの移動には、このパネルの親(frame)に設定されているFocusTraversalPolicyが使用される

- Custom
-- [[Merlinの魔術: フォーカス、フォーカス、フォーカス>http://www.ibm.com/developerworks/jp/java/library/j-mer07153/]]からの引用
-- Tabキー((Shift+Tabキーでは逆順))を押していくと、東西南北の順でボタンのフォーカスが移動
-- 4つのJButton以外には、Tabキーでフォーカスは移動しない

- Layout
-- 以下のようにLayoutFocusTraversalPolicy((Swingでのデフォルト、AWTのデフォルトはDefaultFocusTraversalPolicy))のacceptメソッドをオーバーライドして、編集可の場合でも中央のJTextArea((通常、JTextAreaなどから次のコンポーネントにフォーカス移動する場合は、Ctrl+Tab))には、タブキーなどでフォースが移動しないように設定している
#code{{
frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
  @Override protected boolean accept(Component c) {
    return (c==textarea)?false:super.accept(c);
  }
});
}}

**参考リンク [#n149aa1a]
-[[The AWT Focus Subsystem>http://java.sun.com/javase/ja/6/docs/ja/api/java/awt/doc-files/FocusSpec.html]]
-[[Merlinの魔術: フォーカス、フォーカス、フォーカス>http://www.ibm.com/developerworks/jp/java/library/j-mer07153/]]
-[[Windowを開いたときのフォーカスを指定>Swing/DefaultFocus]]
-[[FocusTraversalKeysに矢印キーを追加してフォーカス移動>Swing/FocusTraversalKeys]]

**コメント [#o2ee0e2b]
#comment