---
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
---
* 概要 [#summary]
KBD{Tab}キーによるフォーカス移動が発生した場合、`ButtonGroup`内で現在選択されている`JRadioButton`にフォーカスが移動するよう設定します。

#download(https://lh3.googleusercontent.com/-r6C4rorBCYw/Vpuu38No8lI/AAAAAAAAOLc/6xa7VoLpsWI/s800-Ic42/ButtonGroupFocusTraversalPolicy.png)

* サンプルコード [#sourcecode]
#code(link){{
buttons.setFocusTraversalPolicyProvider(true);
buttons.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
  @Override public Component getDefaultComponent(Container focusCycleRoot) {
    return Stream.of(focusCycleRoot.getComponents())
      .filter(c -> ((JRadioButton) c).getModel().equals(selection))
      .findFirst().orElse(super.getDefaultComponent(focusCycleRoot));
  }
});
}}

* 解説 [#explanation]
- `Default`
-- %%デフォルトの`LayoutFocusTraversalPolicy`では、`JRadioButton`の選択状態には無関係に、レイアウト内のグループ先頭にある`JRadioButton`にフォーカスが移動する%%
-- [https://bugs.openjdk.java.net/browse/JDK-8033699 JDK-8033699 Incorrect radio button behavior - Java Bug System]で修正済みで、デフォルトで以下と同じ動作をするようになった
-- `OracleJDK 1.8.0_192`で再発している?
-- `OpenJDK 11.0.1`では修正されている
--- [https://bugs.openjdk.java.net/browse/JDK-8154043 JDK-8154043 Fields not reachable anymore by tab-key, because of new tabbing behaviour of radio button groups. - Java Bug System]
- `FocusTraversalPolicy`
-- `JRadioButton`を配置したパネルに`getDefaultComponent(...)`メソッドをオーバーライドした`FocusTraversalPolicy`を設定し現在選択されている`JRadioButton`が存在する場合は、そこにフォーカスが移動する
-- パネルに設定した`FocusTraversalPolicy`を有効にするために`JPanel#setFocusTraversalPolicyProvider(true);`を設定する必要がある

* 参考リンク [#reference]
- [https://stackoverflow.com/questions/34820018/get-the-focus-in-a-buttongroup-of-jradiobuttons-to-go-to-the-currently-selected/34832814#34832814 java - Get the focus in a ButtonGroup of JRadioButtons to go to the currently selected item instead of first - Stack Overflow]
- [https://bugs.openjdk.java.net/browse/JDK-8033699 JDK-8033699 Incorrect radio button behavior - Java Bug System]
- [https://bugs.openjdk.java.net/browse/JDK-8154043 JDK-8154043 Fields not reachable anymore by tab-key, because of new tabbing behaviour of radio button groups. - Java Bug System]

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