Swing/FocusTraversal のバックアップの現在との差分(No.13)
TITLE:Focusの移動
Posted by terai at 2004-04-26
Focusの移動
FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。- category: swing folder: FocusTraversal title: Focusの移動 tags: [FocusTraversalPolicy, Focus] author: aterai pubdate: 2004-04-26T12:45:56+09:00 description: FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。 image:
概要
FocusTraversalPolicy
を使って、Tabキーなどによるフォーカスの移動を制御します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
final JButton nb = new JButton("NORTH");
#spanend
#spandel
final JButton sb = new JButton("SOUTH");
#spanend
#spandel
final JButton wb = new JButton("WEST");
#spanend
#spandel
final JButton eb = new JButton("EAST");
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
JButton nb = new JButton("NORTH");
#spanend
#spanadd
JButton sb = new JButton("SOUTH");
#spanend
#spanadd
JButton wb = new JButton("WEST");
#spanend
#spanadd
JButton eb = new JButton("EAST");
#spanend
add(new JScrollPane(textarea));
add(nb, BorderLayout.NORTH);
add(sb, BorderLayout.SOUTH);
add(wb, BorderLayout.WEST);
add(eb, BorderLayout.EAST);
#spanadd
#spanend
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) {
@Override public Component getFirstComponent(Container focusCycleRoot) {
return order.get(0);
}
@Override
public Component getLastComponent(Container focusCycleRoot) {
return order.get(order.size()-1);
#spanadd
#spanend
@Override public Component getLastComponent(Container focusCycleRoot) {
return order.get(order.size() - 1);
}
@Override
public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
#spanadd
#spanend
@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) {
#spanadd
#spanend
@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) {
#spanadd
#spanend
@Override public Component getDefaultComponent(Container focusCycleRoot) {
return order.get(0);
}
};
frame.setFocusTraversalPolicy(policy);
#spandel
//setFocusTraversalPolicyProvider(true);
#spanend
#spandel
//setFocusTraversalPolicy(policy);
#spanend
#spanadd
// setFocusTraversalPolicyProvider(true);
#spanend
#spanadd
// setFocusTraversalPolicy(policy);
#spanend
解説
上記のサンプルでは、FocusTraversalPolicyを使用することで、キー入力によるフォーカスの移動を制御しています。また、ラジオボタンで以下のようなFocusTraversalPolicyに切り替えることができます。解説
上記のサンプルでは、FocusTraversalPolicy
を使用してキー入力によるフォーカスの移動を制御しています。また、JRadioButton
で以下のようなFocusTraversalPolicy
に切り替えが可能です。
- Default
- JPanelのデフォルトは、null
- 実際のキー入力によるフォーカスの移動には、このパネルの親(frame)に設定されているFocusTraversalPolicyが使用される
- Custom
- Merlinの魔術: フォーカス、フォーカス、フォーカスからの引用
- Tabキー*1を押していくと、東西南北の順でボタンのフォーカスが移動
- 4つのJButton以外には、Tabキーでフォーカスは移動しない
- Layout
-
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) { return ((JTextComponent)c).isEditable(); }else{ if (c instanceof JTextComponent) { return ((JTextComponent) c).isEditable(); } else { return super.accept(c); } //return (c==textarea)?false:super.accept(c); } #spandel }); #spanend #spanadd }; #spanend
- 以下のように
参考リンク
- The AWT Focus Subsystem
- Merlinの魔術: フォーカス、フォーカス、フォーカス
- Windowを開いたときのフォーカスを指定
- FocusTraversalKeysに矢印キーを追加してフォーカス移動
参考リンク
- AWTフォーカス・サブシステム
- Merlinの魔術: フォーカス、フォーカス、フォーカス
- Windowを開いたときのフォーカスを指定
- FocusTraversalKeysに矢印キーを追加してフォーカス移動