Swing/ContainerOrderFocusTraversalPolicy のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ContainerOrderFocusTraversalPolicy へ行く。
- 1 (2024-01-01 (月) 12:40:17)
- 2 (2024-01-15 (月) 14:20:28)
- category: swing folder: ContainerOrderFocusTraversalPolicy title: ComponentのFocus移動をContainerに追加した順番に設定する tags: [Container, Component, Focus, FocusTraversalPolicy, LayoutManager] author: aterai pubdate: 2024-01-01T12:39:23+09:00 description: ComponentのFocus移動を親Containerに追加した順番で循環するContainerOrderFocusTraversalPolicyを設定します。 image: https://drive.google.com/uc?id=1lG6lBzr-HmSWdfylbxnJpFOe7x-0HfBZ
概要
Component
のFocus
移動を親Container
に追加した順番で循環するContainerOrderFocusTraversalPolicy
を設定します。
Screenshot
Advertisement
サンプルコード
JPanel p = new JPanel(new GridBagLayout());
p.setFocusTraversalPolicy(new ContainerOrderFocusTraversalPolicy());
p.setFocusTraversalPolicyProvider(true);
p.setFocusable(false);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
List<JComponent> list = Arrays.asList(
new JRadioButton("JRadioButton1"),
new JRadioButton("JRadioButton2"),
new JRadioButton("JRadioButton3", true),
new JLabel("JLabel1"),
new JLabel("JLabel2"),
new JCheckBox("JCheckBox1"),
new JCheckBox("JCheckBox2"));
for (JComponent c : list) {
if (c instanceof JRadioButton) {
group.add((JRadioButton) c);
} else if (c instanceof JLabel) {
c.setFocusable(false);
}
p.add(c, gbc);
}
gbc.gridx = 2;
gbc.weightx = 1.0;
list.forEach(c -> p.add(new JTextField(), gbc));
View in GitHub: Java, Kotlin解説
LayoutFocusTraversalPolicy
Swing
の軽量コンポーネントのデフォルトContainerOrderFocusTraversalPolicy
を継承するDefaultFocusTraversalPolicy
はAWT
の重量コンポーネント用のデフォルトDefaultFocusTraversalPolicy#accept(...)
をオーバーライドして軽量コンポーネントは拒否するので、JPanel
などの軽量コンポーネントにDefaultFocusTraversalPolicy
を設定するとタブキーによる子コンポーネントのフォーカス移動が不可になる
- 追加順ではなくレイアウトされた座標などに従って(
SortingFocusTraversalPolicy
やLayoutComparator
を参照)フォーカス移動するため、たとえばこのサンプルのJRadioButton
の次のフォーカスは右隣のJTextField
になる
ContainerOrderFocusTraversalPolicy
- コンポーネントの追加順(
Container#getComponentZOrder(...)
で取得可能なZ
軸順インデックス)でフォーカス移動するFocusTraversalPolicy
- たとえばこのサンプルの
JRadioButton
の次のフォーカスはJCheckBox
になる- タブキーによるフォーカス移動で
JRadioButton
の次がJRadioButton
にならないのは、同一ButtonGroup
内のボタンはスキップするようBasicButtonUI
で設定されているため LayoutFocusTraversalPolicy
ではJLabel
のようなJComponent.WHEN_FOCUSED
時のInputMap
が存在しないコンポーネントは自動的にフォーカス移動対象外となるが、ContainerOrderFocusTraversalPolicy
はそうではないので、このサンプルのJLabel
にはsetFocusable(false)
を設定することでフォーカス移動の対象から除外している
- タブキーによるフォーカス移動で
- コンポーネントの追加順(
ContainerOrderFocusTraversalPolicy
+ButtonGroupFocusTraversalPolicy
- ButtonGroup内で最初にフォーカスを取得するJRadioButtonを変更する同様、
ContainerOrderFocusTraversalPolicy#getDefaultComponent(...)
をオーバーライドして選択状態のJRadioButton
に初期フォーカスを設定
- ButtonGroup内で最初にフォーカスを取得するJRadioButtonを変更する同様、
参考リンク
- Focusの移動
- [AWTフォーカス・サブシステム](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/doc-files/FocusSpec.html)
- JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える
JColorChooser
の色選択パネルにContainerOrderFocusTraversalPolicy
が使用されている
- ButtonGroup内で最初にフォーカスを取得するJRadioButtonを変更する