TITLE:Focusの移動

Focusの移動

Posted by terai at 2004-04-26
  • category: swing folder: FocusTraversal title: Focusの移動 tags: [FocusTraversalPolicy, Focus] author: aterai pubdate: 2004-04-26T12:45:56+09:00 description: FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTNE9BAwqI/AAAAAAAAAaM/57d2rzX7ixk/s800/FocusTraversal.png

概要

FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。

概要

FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。Merlinの魔術: フォーカス、フォーカス、フォーカスからの引用です。
  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
JButton nb = new JButton("NORTH");
JButton sb = new JButton("SOUTH");
JButton wb = new JButton("WEST");
JButton eb = new JButton("EAST");
#spandel
add(new JScrollPane(field), BorderLayout.CENTER);
#spanend
#spanadd
add(new JScrollPane(textarea));
#spanend
add(nb, BorderLayout.NORTH);
add(sb, BorderLayout.SOUTH);
add(wb, BorderLayout.WEST);
add(eb, BorderLayout.EAST);
#spandel
final Component[] order = new Component[]{eb, wb, sb, nb};
#spanend
#spanadd

#spanend
FocusTraversalPolicy policy = new FocusTraversalPolicy() {
  java.util.List list = Arrays.asList(order);
  public Component getFirstComponent(Container focusCycleRoot) {
    return order[0];
  private final List<? extends Component> order = Arrays.asList(eb, wb, sb, nb);
  @Override public Component getFirstComponent(Container focusCycleRoot) {
    return order.get(0);
  }
  public Component getLastComponent(Container focusCycleRoot) {
    return order[order.length-1];
#spanadd

#spanend
  @Override public Component getLastComponent(Container focusCycleRoot) {
    return order.get(order.size() - 1);
  }
  public Component getComponentAfter(Container fcr, Component cmp) {
    int index = list.indexOf(cmp);
    return order[(index + 1) % order.length];
#spanadd

#spanend
  @Override public Component getComponentAfter(
      Container focusCycleRoot, Component aComponent) {
    int i = order.indexOf(aComponent);
    return order.get((i + 1) % order.size());
  }
  public Component getComponentBefore(Container fcr, Component cmp) {
    int index = list.indexOf(cmp);
    return order[(index - 1 + order.length) % order.length];
#spanadd

#spanend
  @Override public Component getComponentBefore(
      Container focusCycleRoot, Component aComponent) {
    int i = order.indexOf(aComponent);
    return order.get((i - 1 + order.size()) % order.size());
  }
  public Component getDefaultComponent(Container focusCycleRoot) {
    return order[0];
#spanadd

#spanend
  @Override public Component getDefaultComponent(Container focusCycleRoot) {
    return order.get(0);
  }
};
frame.setFocusTraversalPolicy(policy);
#spandel
//setFocusTraversalPolicyProvider(true);
#spanend
#spandel
//setFocusTraversalPolicy(policy);
#spanend
#spanadd
// setFocusTraversalPolicyProvider(true);
#spanend
#spanadd
// setFocusTraversalPolicy(policy);
#spanend

解説

上記のサンプルでは、Tabキー*1を押していくと、東西南北の順でボタンのフォーカスが移動します。中央のテキストフィールドにはTabキーでフォーカスは移動しません。

解説

上記のサンプルでは、FocusTraversalPolicyを使用してキー入力によるフォーカスの移動を制御しています。また、JRadioButtonで以下のようなFocusTraversalPolicyに切り替えが可能です。 FocusTraversalPolicyを使用することで、キー入力によるフォーカスの移動を制御しています。コンポーネントを追加したパネルではなく、親のフレームにsetFocusTraversalPolicy()していることに注意してください。パネルに設定したい場合は、そのパネルがフォーカストラバーサルポリシーを提供するように、Container#setFocusTraversalPolicyProvider(true)としておく必要があります。
  • Default
    • JPanelのデフォルトは、null
    • 実際のキー入力によるフォーカスの移動にはこのパネルの親(JFrame)に設定されているFocusTraversalPolicyを使用
  • Custom
  • Layout
    • 以下のようにLayoutFocusTraversalPolicy(LayoutFocusTraversalPolicySwingのデフォルト、AWTのデフォルトはDefaultFocusTraversalPolicy)のacceptメソッドをオーバーライドして中央のJTextArea(通常JTextAreaなどから次のコンポーネントにフォーカス移動する場合はCtrl+Tab)が編集不可の場合は、これにTabキーなどでフォーカスが移動しないように設定
      #spanend
      #spanadd
      frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
      #spanend
        @Override protected boolean accept(Component c) {
          if (c instanceof JTextComponent) {
            return ((JTextComponent) c).isEditable();
          } else {
            return super.accept(c);
          }
        }
      #spanadd
      };
      #spanend
      #spanadd
      

参考リンク

参考リンク

コメント

コメント