Swing/DefaultFocus のバックアップ差分(No.16)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DefaultFocus へ行く。
- 1 (2008-04-09 (水) 00:12:54)
- 2 (2008-04-09 (水) 18:04:57)
- 3 (2008-04-18 (金) 19:31:02)
- 4 (2008-05-07 (水) 18:51:40)
- 5 (2008-05-07 (水) 21:16:15)
- 6 (2008-05-12 (月) 14:39:52)
- 7 (2008-05-18 (日) 16:18:55)
- 8 (2008-12-16 (火) 21:46:00)
- 9 (2009-03-19 (木) 14:51:30)
- 10 (2009-08-14 (金) 16:37:58)
- 11 (2009-11-13 (金) 15:06:33)
- 12 (2009-11-23 (月) 19:47:59)
- 13 (2011-03-05 (土) 01:18:28)
- 14 (2012-05-15 (火) 11:55:25)
- 15 (2013-04-13 (土) 04:34:01)
- 16 (2013-07-26 (金) 01:41:07)
- 17 (2013-08-02 (金) 20:51:58)
- 18 (2013-09-11 (水) 00:37:56)
- 19 (2013-10-02 (水) 15:37:22)
- 20 (2013-10-09 (水) 18:48:56)
- 21 (2014-11-25 (火) 03:03:31)
- 22 (2015-01-29 (木) 15:40:31)
- 23 (2016-06-29 (水) 17:31:06)
- 24 (2016-09-14 (水) 18:07:18)
- 25 (2017-04-04 (火) 14:17:08)
- 26 (2017-10-26 (木) 10:54:59)
- 27 (2018-09-07 (金) 16:38:30)
- 28 (2020-09-01 (火) 14:50:56)
- 29 (2022-03-17 (木) 15:21:36)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:Windowを開いたときのフォーカスを指定 #navi(../) #tags() #tags(JFrame, JDialog, Focus, FocusTraversalPolicy, WindowListener, ComponentListener, KeyboardFocusManager) RIGHT:Posted by &author(aterai); at 2004-10-11 *Windowを開いたときのフォーカスを指定 [#q0754f35] JFrameやJDialogなどのWindowを開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。 ``JFrame``や``JDialog``などの``Window``を開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTKp09XXEI/AAAAAAAAAWU/p3YhSijyS90/s800/DefaultFocus.png) **サンプルコード [#c961d3aa] #code(link){{ EventQueue.invokeLater(new Runnable() { @Override public void run() { field.requestFocusInWindow(); } }); }} **解説 [#u7271535] 上記のサンプルでは、JTextFieldがデフォルトのフォーカスを持つように、JComponent#requestFocusInWindowメソッドを使用しています。 上記のサンプルでは、``JTextField``がデフォルトのフォーカスを持つように、``JComponent#requestFocusInWindow``メソッドを使用しています。 requestFocusInWindowメソッドは、チュートリアル([http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html How to Use the Focus Subsystem])にあるように、frame.pack();した後で実行する必要があります。このため、このサンプルではEventQueue.invokeLaterを使って、待ち状態のすべてのイベントが処理されたあとで実行するようにしています。 ``requestFocusInWindow``メソッドは、チュートリアル([http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html How to Use the Focus Subsystem])にあるように、``frame.pack();``した後で実行する必要があります。このため、このサンプルでは``EventQueue.invokeLater``を使って、待ち状態のすべてのイベントが処理されたあとで実行するようにしています。 ---- 以下のように、FocusTraversalPolicyやWindowListenerを使う方法でも、同様にデフォルトのフォーカスを持つコンポーネントを指定することが出来ます。 以下のように、``FocusTraversalPolicy``や``WindowListener``を使う方法でも、同様にデフォルトのフォーカスを持つコンポーネントを指定することが出来ます。 -FocusTraversalPolicyを使用 --FocusTraversalPolicy を設定して、最初にフォーカスの当たるコンポーネントを指定(JDK 1.4 以降) - ``FocusTraversalPolicy``を使用 -- ``FocusTraversalPolicy``を設定して、最初にフォーカスの当たるコンポーネントを指定(``JDK 1.4.0``以降) #code{{ frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() { @Override public Component getInitialComponent(Window w) { return field; } }); }} -WindowListener#windowOpened で、requestFocusInWindow --フレームにWindowListenerを設定して、windowOpenedが呼び出されたときに、requestFocusInWindow - ``WindowListener#windowOpened``で、``requestFocusInWindow`` -- フレームに``WindowListener``を設定して、``windowOpened``が呼び出されたときに、``requestFocusInWindow`` #code{{ frame.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { field.requestFocusInWindow(); } }); }} -ComponentListener#componentShown で、requestFocusInWindow --フレームにComponentListenerを設定して、componentShownが呼び出されたとき(=フレームがsetVisible(true)されたとき)に、requestFocusInWindow - ``ComponentListener#componentShown``で、``requestFocusInWindow`` -- フレームに``ComponentListener``を設定して、``componentShown``が呼び出されたとき(=フレームが``setVisible(true)``されたとき)に、``requestFocusInWindow`` #code{{ frame.addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { field.requestFocusInWindow(); } }); }} -KeyboardFocusManager#addPropertyChangeListener で、requestFocusInWindow --KeyboardFocusManagerにPropertyChangeListenerを設定して、propertyChangeが呼び出され、PropertyNameが、"activeWindow"、かつPropertyChangeEvent#getNewValueがnullでないときに、requestFocusInWindow - ``KeyboardFocusManager#addPropertyChangeListener``で、``requestFocusInWindow`` -- ``KeyboardFocusManager``に``PropertyChangeListener``を設定して、``propertyChange``が呼び出され、``PropertyName``が、``activeWindow``、かつ``PropertyChangeEvent#getNewValue``が``null``でないときに、``requestFocusInWindow`` #code{{ KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); kfm.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if("activeWindow".equals(prop) && e.getNewValue()!=null) { System.out.println("activeWindow"); field.requestFocusInWindow(); } } }); }} //---- //このサンプルでは、ウィンドウを開いたときにフォーカスを持つコンポーネントとは別に、フォーカスがボタンにない場合((ルート区画内に JTextPane やフォーカスのあるJButtonなどの起動イベントを消費する別のコンポーネントがある場合は除く))でも、Enterキーを押したときに起動されるボタンを以下のメソッドを使って設定しています([http://docs.oracle.com/javase/jp/6/api/javax/swing/JRootPane.html#setDefaultButton(javax.swing.JButton) JRootPane#setDefaultButton(javax.swing.JButton)])。 //#code{{ //frame.getRootPane().setDefaultButton(eb); //}} **参考リンク [#z4f652d0] -[[Focusの移動>Swing/FocusTraversal]] -[http://forums.sun.com/thread.jspa?threadID=579294 Swing - When does requestFocusInWindow() fail] -[[JOptionPaneのデフォルトフォーカス>Swing/OptionPaneDefaultFocus]] - [[Focusの移動>Swing/FocusTraversal]] - [http://forums.sun.com/thread.jspa?threadID=579294 Swing - When does requestFocusInWindow() fail] - [[JOptionPaneのデフォルトフォーカス>Swing/OptionPaneDefaultFocus]] **コメント [#x1950fff] - JFrame#getRootPane()#setDefaultButton()は使用方法がよくわからない… -- [[aterai]] - setDefaultButtonって、Enterしたときに押されたとみなすボタンだったかな…… -- &new{2004-10-14 (木) 23:21:53}; -- ありがとうございます。おかげでようやく理解できました。JTextFieldなどを編集状態にしたあと、EnterするとsetDefaultButtonしたボタンが押されるのですね。 -- [[aterai]] &new{2004-10-18 (月) 12:14:15}; -- というわけで、frame.getRootPane().setDefaultButton(eb);を追加してみました。上記のサンプルでは、中央のJTextFieldにフォーカスがある状態で、リターンキーを押すと、EASTボタンが押されたことになります。 -- [[aterai]] &new{2004-10-18 (月) 12:20:58}; -- %%いつか、DefaultButton のページを別に作成すること。 -- [[aterai]] &new{2008-05-07 (水) 19:19:44};%% - ``JFrame#getRootPane()#setDefaultButton()``は使用方法がよくわからない… -- [[aterai]] - ``setDefaultButton``って、``Enter``したときに押されたとみなすボタンだったかな…… -- &new{2004-10-14 (木) 23:21:53}; -- ありがとうございます。おかげでようやく理解できました。``JTextField``などにフォーカスがある状態で``Enter``キーを入力すると``setDefaultButton``したボタンが押されるのですね。 -- [[aterai]] &new{2004-10-18 (月) 12:14:15}; -- というわけで、``frame.getRootPane().setDefaultButton(eb);``を追加してみました。上記のサンプルでは、中央の``JTextField``にフォーカスがある状態で、リターンキーを押すと、``EAST``ボタンが押されたことになります。 -- [[aterai]] &new{2004-10-18 (月) 12:20:58}; -- %%いつか、``DefaultButton``のページを別に作成すること。 -- [[aterai]] &new{2008-05-07 (水) 19:19:44};%% -- [[DefaultButtonの設定>Swing/DefaultButton]]に移動。 -- [[aterai]] &new{2008-05-12 (月) 14:40:15}; - HierarchyListenerを使用する場合のテスト -- [[aterai]] &new{2009-03-19 (木) 14:51:30}; - ``HierarchyListener``を使用する場合のテスト -- [[aterai]] &new{2009-03-19 (木) 14:51:30}; -- [[JOptionPaneのデフォルトフォーカス>Swing/OptionPaneDefaultFocus]]に移動 #comment