ButtonGroup内で最初にフォーカスを取得するJRadioButtonを変更する
Total: 5691
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
Tabキーによるフォーカス移動が発生した場合、ButtonGroup
内で現在選択されているJRadioButton
にフォーカスが移動するよう設定します。
Screenshot
Advertisement
サンプルコード
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));
}
});
View in GitHub: Java, Kotlin解説
Default
デフォルトのLayoutFocusTraversalPolicy
では、JRadioButton
の選択状態には無関係に、レイアウト内のグループ先頭にあるJRadioButton
にフォーカスが移動する- [JDK-8033699] Incorrect radio button behavior - Java Bug Systemで修正済で、デフォルトで以下と同じ動作をするようになった
OracleJDK 1.8.0_192
で再発したが8u311
で再修正済OpenJDK 11.0.1
では修正されている
FocusTraversalPolicy
JRadioButton
を配置したパネルにgetDefaultComponent(...)
メソッドをオーバーライドしたFocusTraversalPolicy
を設定し現在選択されているJRadioButton
が存在する場合は、そこにフォーカスが移動する- パネルに設定した
FocusTraversalPolicy
を有効にするためにJPanel#setFocusTraversalPolicyProvider(true);
を設定する必要がある
参考リンク
- java - Get the focus in a ButtonGroup of JRadioButtons to go to the currently selected item instead of first - Stack Overflow
- [JDK-8033699] Incorrect radio button behavior - Java Bug System
- [JDK-8154043] Fields not reachable anymore by tab-key, because of new tabbing behaviour of radio button groups. - Java Bug System