TITLE:Focusの移動

Posted by at 2004-04-26

Focusの移動

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

  • &jnlp;
  • &jar;
  • &zip;
FocusTraversal.png

サンプルコード

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);
View in GitHub: Java, Kotlin

解説

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

  • `Default`
    • `JPanelのデフォルトは、null`
    • 実際のキー入力によるフォーカスの移動には、このパネルの親(`JFrame)に設定されているFocusTraversalPolicy`が使用される
  • `Layout`
    • 以下のように`LayoutFocusTraversalPolicy(LayoutFocusTraversalPolicySwingのデフォルト、AWTのデフォルトはDefaultFocusTraversalPolicy)のacceptメソッドをオーバーライドして、中央のJTextArea(通常、JTextArea`などから次のコンポーネントにフォーカス移動する場合は、Ctrl+TAB)が編集不可の場合は、これにTABキーなどでフォースが移動しないように設定している
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);
  }
});

参考リンク

コメント