Swing/FocusTraversal のバックアップ(No.21)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FocusTraversal へ行く。
- 1 (2007-07-26 (木) 14:38:58)
- 2 (2007-12-21 (金) 18:36:24)
- 3 (2008-04-08 (火) 18:58:33)
- 4 (2008-04-09 (水) 18:12:46)
- 5 (2008-04-18 (金) 19:09:54)
- 6 (2008-05-15 (木) 20:20:25)
- 7 (2008-05-21 (水) 20:38:40)
- 8 (2008-06-03 (火) 18:43:18)
- 9 (2008-06-18 (水) 12:38:08)
- 10 (2008-06-26 (木) 14:17:21)
- 11 (2009-03-16 (月) 17:05:15)
- 12 (2010-02-05 (金) 18:37:59)
- 13 (2010-02-06 (土) 04:07:51)
- 14 (2010-03-12 (金) 14:18:41)
- 15 (2013-04-07 (日) 04:48:13)
- 16 (2013-07-26 (金) 01:18:29)
- 17 (2013-08-20 (火) 14:24:00)
- 18 (2014-05-21 (水) 21:26:47)
- 19 (2014-05-22 (木) 13:57:37)
- 20 (2014-06-04 (水) 22:12:32)
- 21 (2014-11-05 (水) 05:02:23)
- 22 (2015-12-04 (金) 18:07:19)
- 23 (2016-09-14 (水) 18:09:24)
- 24 (2017-10-27 (金) 13:32:59)
- 25 (2017-11-02 (木) 15:29:16)
- 26 (2018-10-02 (火) 13:55:59)
- 27 (2020-10-01 (木) 18:17:54)
- 28 (2022-06-11 (土) 15:36:04)
- title: Focusの移動 tags: [FocusTraversalPolicy, Focus] author: aterai pubdate: 2004-04-26 description: FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。
概要
FocusTraversalPolicy
を使って、Tabキーなどによるフォーカスの移動を制御します。
Screenshot
Advertisement
サンプルコード
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
が使用される
Custom
- Merlinの魔術: フォーカス、フォーカス、フォーカスからの引用
- Tabキーを押していくと、東西南北の順でボタンのフォーカスが移動(Shift+Tabキーでは逆順)
4
つのJButton
以外には、Tabキーでフォーカスは移動しない
Layout
- 以下のように
LayoutFocusTraversalPolicy
(LayoutFocusTraversalPolicy
はSwing
のデフォルト、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);
}
});
参考リンク
- AWT フォーカスサブシステム
- Merlinの魔術: フォーカス、フォーカス、フォーカス
- Windowを開いたときのフォーカスを指定
- FocusTraversalKeysに矢印キーを追加してフォーカス移動