• category: swing folder: ButtonGroupFocusTraversalPolicy title: ButtonGroup内で最初にフォーカスを取得するJRadioButtonを変更する tags: [ButtonGroup, FocusTraversalPolicy, JRadioButton, Focus] author: aterai pubdate: 2016-01-18T00:09:46+09:00 description: Tabキーによるフォーカス移動が発生した場合、ButtonGroup内で現在選択されているJRadioButtonにフォーカスが移動するよう設定します。 image: https://lh3.googleusercontent.com/-r6C4rorBCYw/Vpuu38No8lI/AAAAAAAAOLc/6xa7VoLpsWI/s800-Ic42/ButtonGroupFocusTraversalPolicy.png hreflang:
       href: https://java-swing-tips.blogspot.com/2016/05/the-jradiobutton-that-is-currently_10.html
       lang: en

概要

概要

Tabキーによるフォーカス移動が発生した場合、ButtonGroup内で現在選択されているJRadioButtonにフォーカスが移動するよう設定します。

サンプルコード

サンプルコード

buttons.setFocusTraversalPolicyProvider(true);
buttons.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
  @Override public Component getDefaultComponent(Container focusCycleRoot) {
    ButtonModel selection = bg.getSelection();
    for (Component c: focusCycleRoot.getComponents()) {
      JRadioButton radioBtn = (JRadioButton) c;
      ButtonModel loopModel = radioBtn.getModel();
      if (loopModel == selection) {
        return radioBtn;
      }
    }
    return super.getDefaultComponent(focusCycleRoot);
    return Stream.of(focusCycleRoot.getComponents())
      .filter(c -> ((JRadioButton) c).getModel().equals(selection))
      .findFirst().orElse(super.getDefaultComponent(focusCycleRoot));
  }
});
#spandel

#spanend
View in GitHub: Java, Kotlin

解説

解説

  • Default
  • FocusTraversalPolicy
    • JRadioButtonを配置したパネルにgetDefaultComponent(...)メソッドをオーバーライドしたFocusTraversalPolicyを設定し、現在選択されているJRadioButtonが存在する場合は、それにフォーカスを移動する
    • パネルに設定したFocusTraversalPolicyを有効にするために、JPanel#setFocusTraversalPolicyProvider(true);を設定する必要がある
    • JRadioButtonを配置したパネルにgetDefaultComponent(...)メソッドをオーバーライドしたFocusTraversalPolicyを設定し現在選択されているJRadioButtonが存在する場合は、そこにフォーカスが移動する
    • パネルに設定したFocusTraversalPolicyを有効にするためにJPanel#setFocusTraversalPolicyProvider(true);を設定する必要がある

参考リンク

参考リンク

コメント

コメント