Swing/FocusTraversal のバックアップ差分(No.16)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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の移動 #navi(../) #tags() #tags(FocusTraversalPolicy, Focus) RIGHT:Posted by &author(aterai); at 2004-04-26 *Focusの移動 [#x8547c84] FocusTraversalPolicyを使って、Tabキーなどによるフォーカスの移動を制御します。 ``FocusTraversalPolicy``を使って、``Tab``キーなどによるフォーカスの移動を制御します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTNE9BAwqI/AAAAAAAAAaM/57d2rzX7ixk/s800/FocusTraversal.png) **サンプルコード [#le272dee] #code(link){{ 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); }} **解説 [#h3d0848b] 上記のサンプルでは、FocusTraversalPolicyを使用することで、キー入力によるフォーカスの移動を制御しています。また、ラジオボタンで以下のようなFocusTraversalPolicyに切り替えることができます。 上記のサンプルでは、``FocusTraversalPolicy``を使用することで、キー入力によるフォーカスの移動を制御しています。また、ラジオボタンで以下のような``FocusTraversalPolicy``に切り替えることができます。 - Default -- JPanelのデフォルトは、null -- 実際のキー入力によるフォーカスの移動には、このパネルの親(frame)に設定されているFocusTraversalPolicyが使用される - ``Default`` -- ``JPanel``のデフォルトは、``null`` -- 実際のキー入力によるフォーカスの移動には、このパネルの親(``JFrame``)に設定されている``FocusTraversalPolicy``が使用される - Custom - ``Custom`` -- [http://www.ibm.com/developerworks/jp/java/library/j-mer07153/ Merlinの魔術: フォーカス、フォーカス、フォーカス]からの引用 -- Tabキーを押していくと、東西南北の順でボタンのフォーカスが移動(Shift+Tabキーでは逆順) -- 4つのJButton以外には、Tabキーでフォーカスは移動しない -- ``Tab``キーを押していくと、東西南北の順でボタンのフォーカスが移動(``Shift``+``Tab``キーでは逆順) -- ``4``つの``JButton``以外には、``Tab``キーでフォーカスは移動しない - Layout -- 以下のようにLayoutFocusTraversalPolicy((LayoutFocusTraversalPolicyはSwingのデフォルト、AWTのデフォルトはDefaultFocusTraversalPolicy))のacceptメソッドをオーバーライドして、中央のJTextArea((通常、JTextAreaなどから次のコンポーネントにフォーカス移動する場合は、Ctrl+Tab))が編集不可の場合は、これにタブキーなどでフォースが移動しないように設定している - ``Layout`` -- 以下のように``LayoutFocusTraversalPolicy``(``LayoutFocusTraversalPolicy``は``Swing``のデフォルト、``AWT``のデフォルトは``DefaultFocusTraversalPolicy``)の``accept``メソッドをオーバーライドして、中央の``JTextArea``(通常、``JTextArea``などから次のコンポーネントにフォーカス移動する場合は、``Ctrl``+``Tab``)が編集不可の場合は、これにタブキーなどでフォースが移動しないように設定している #code{{ 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); } }); }} **参考リンク [#n149aa1a] -[http://docs.oracle.com/javase/jp/6/api/java/awt/doc-files/FocusSpec.html The AWT Focus Subsystem] -[http://www.ibm.com/developerworks/jp/java/library/j-mer07153/ Merlinの魔術: フォーカス、フォーカス、フォーカス] -[[Windowを開いたときのフォーカスを指定>Swing/DefaultFocus]] -[[FocusTraversalKeysに矢印キーを追加してフォーカス移動>Swing/FocusTraversalKeys]] - [http://docs.oracle.com/javase/jp/6/api/java/awt/doc-files/FocusSpec.html The AWT Focus Subsystem] - [http://www.ibm.com/developerworks/jp/java/library/j-mer07153/ Merlinの魔術: フォーカス、フォーカス、フォーカス] - [[Windowを開いたときのフォーカスを指定>Swing/DefaultFocus]] - [[FocusTraversalKeysに矢印キーを追加してフォーカス移動>Swing/FocusTraversalKeys]] **コメント [#o2ee0e2b] #comment