Swing/DefaultFocus のバックアップの現在との差分(No.13)
TITLE:Windowを開いたときのフォーカスを指定
Posted by aterai at 2004-10-11
Windowを開いたときのフォーカスを指定
JFrameやJDialogなどのWindowを開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。- category: swing folder: DefaultFocus title: Windowを開いたときのフォーカスを指定 tags: [JFrame, JDialog, Focus, FocusTraversalPolicy, WindowListener, ComponentListener, KeyboardFocusManager] author: aterai pubdate: 2004-10-11T07:41:37+09:00 description: JFrameやJDialogなどのWindowを開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。 image:
概要
JFrame
やJDialog
などのWindow
を開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
EventQueue.invokeLater(new Runnable() {
public void run() {
@Override public void run() {
field.requestFocusInWindow();
}
});
解説
上記のサンプルでは、JTextFieldがデフォルトのフォーカスを持つように、JComponent#requestFocusInWindowメソッドを使用しています。解説
上記のサンプルでは、JTextField
がデフォルトのフォーカスを持つようにJComponent#requestFocusInWindow()
メソッドを使用しています。
requestFocusInWindowメソッドは、チュートリアルHow to Use the Focus Subsystemにあるように、frame.pack();した後で実行する必要があります。このため、このサンプルではEventQueue.invokeLaterを使って、待ち状態のすべてのイベントが処理されたあとで実行するようにしています。
-
JComponent#requestFocusInWindow()
メソッドはチュートリアル(How to Use the Focus Subsystem)にあるようにJFrame#pack()
、もしくはJFrame#setSize(...)
などでリサイズされた後(フォーカスを取得するコンポーネントのサイズが決まった後)で実行する必要がある - このため、このサンプルでは
EventQueue.invokeLater(...)
を使って待ち状態のすべてのイベントが処理された後で実行している
以下のように、FocusTraversalPolicyやWindowListenerを使う方法でも、同様にデフォルトのフォーカスを持つコンポーネントを指定することが出来ます。
- 以下のように
FocusTraversalPolicy
やWindowListener
を使う方法でも同様にデフォルトのフォーカスを持つコンポーネントを指定可能-
FocusTraversalPolicy
を設定して最初にフォーカスの当たるコンポーネントを指定(JDK 1.4.0
以降)
-
- FocusTraversalPolicyを使用
- FocusTraversalPolicy を設定して、最初にフォーカスの当たるコンポーネントを指定(JDK 1.4 以降)
frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() { @Override public Component getInitialComponent(Window w) { @Override public Component getInitialComponent(Window w) { return field; } });
- FocusTraversalPolicy を設定して、最初にフォーカスの当たるコンポーネントを指定(JDK 1.4 以降)
- WindowListener#windowOpened で、requestFocusInWindow
- フレームにWindowListenerを設定して、windowOpenedが呼び出されたときに、requestFocusInWindow
-
WindowListener#windowOpened(...)
でrequestFocusInWindow()
- フレームに
WindowListener
を設定してwindowOpened(...)
が呼び出されたときに、requestFocusInWindow()
を実行
- フレームに
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
@Override public void windowOpened(WindowEvent e) {
field.requestFocusInWindow();
}
});
- ComponentListener#componentShown で、requestFocusInWindow
- フレームにComponentListenerを設定して、componentShownが呼び出されたとき(=フレームがsetVisible(true)されたとき)に、requestFocusInWindow
-
ComponentListener#componentShown(...)
でrequestFocusInWindow()
- フレームに
ComponentListener
を設定してcomponentShown(...)
が呼び出されたとき(=フレームがsetVisible(true)
されたとき)にrequestFocusInWindow()
を実行
- フレームに
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
@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()
を実行
-
#spandel
KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
#spanend
#spandel
focusManager.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
#spanend
public void propertyChange(java.beans.PropertyChangeEvent e) {
#spanadd
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
#spanend
#spanadd
kfm.addPropertyChangeListener(new PropertyChangeListener() {
#spanend
@Override public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if("activeWindow".equals(prop) && e.getNewValue()!=null) {
if ("activeWindow".equals(prop) && e.getNewValue() != null) {
System.out.println("activeWindow");
field.requestFocusInWindow();
}
}
});
参考リンク
参考リンク
コメント
- JFrame#getRootPane()#setDefaultButton()は使用方法がよくわからない… -- aterai
- setDefaultButtonって、Enterしたときに押されたとみなすボタンだったかな…… --
- ありがとうございます。おかげでようやく理解できました。JTextFieldなどを編集状態にしたあと、EnterするとsetDefaultButtonしたボタンが押されるのですね。 -- aterai
- というわけで、frame.getRootPane().setDefaultButton(eb);を追加してみました。上記のサンプルでは、中央のJTextFieldにフォーカスがある状態で、リターンキーを押すと、EASTボタンが押されたことになります。 -- aterai
-
いつか、DefaultButton のページを別に作成すること。 -- aterai - DefaultButtonの設定に移動。 -- aterai
- HierarchyListenerを使用する場合のテスト -- aterai
コメント
-
JFrame#getRootPane()#setDefaultButton()
は使用方法がよくわからない… -- aterai -
setDefaultButton
って、Enterしたときに押されたとみなすボタンだったかな…… --- ありがとうございます。おかげでようやく理解できました。
JTextField
などにフォーカスがある状態でEnterキーを入力するとsetDefaultButton
したボタンが押されるのですね。 -- aterai - というわけで、
frame.getRootPane().setDefaultButton(eb);
を追加してみました。上記のサンプルでは、中央のJTextField
にフォーカスがある状態で、Enterキーを押すと、EAST
ボタンが押されたことになります。 -- aterai -
いつか、DefaultButton
のページを別に作成すること。 -- aterai - DefaultButtonの設定に移動。 -- aterai
- ありがとうございます。おかげでようやく理解できました。
-
HierarchyListener
を使用する場合のテスト -- aterai