Swing/DefaultFocus のバックアップ(No.33)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 30 (2025-01-03 (金) 08:57:02)
- 31 (2025-01-03 (金) 09:01:23)
- 32 (2025-01-03 (金) 09:02:38)
- 33 (2025-01-03 (金) 09:03:21)
- 34 (2025-01-03 (金) 09:04:02)
- 35 (2025-06-19 (木) 12:41:37)
- 36 (2025-06-19 (木) 12:43:47)
 
- 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:  
Summary
JFrameやJDialogなどのWindowを開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。
Screenshot

Advertisement
Source Code Examples
EventQueue.invokeLater(new Runnable() {
  @Override public void run() {
    field.requestFocusInWindow();
  }
});
Explanation
上記のサンプルでは、JTextFieldがデフォルトのフォーカスを持つようにJComponent#requestFocusInWindow()メソッドを使用しています。
- JComponent#requestFocusInWindow()メソッドはチュートリアル(How to Use the Focus Subsystem)にあるように- JFrame#pack()、もしくは- JFrame#setSize(...)などでリサイズされた後(フォーカスを取得するコンポーネントのサイズが決まった後)で実行する必要がある
- このため、このサンプルではEventQueue.invokeLater(...)を使って待ち状態のすべてのイベントが処理された後で実行している
- 以下のようにFocusTraversalPolicyやWindowListenerを使う方法でも同様にデフォルトのフォーカスを持つコンポーネントを指定可能- FocusTraversalPolicyを設定して最初にフォーカスの当たるコンポーネントを指定(- JDK 1.4.0以降)
 
frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
  @Override public Component getInitialComponent(Window w) {
    return field;
  }
});
- WindowListener#windowOpened(...)で- requestFocusInWindow()- フレームにWindowListenerを設定してwindowOpened(...)が呼び出されたときに、requestFocusInWindow()を実行
 
- フレームに
frame.addWindowListener(new WindowAdapter() {
  @Override public void windowOpened(WindowEvent e) {
    field.requestFocusInWindow();
  }
});
- ComponentListener#componentShown(...)で- requestFocusInWindow()- フレームにComponentListenerを設定してcomponentShown(...)が呼び出されたとき(=フレームがsetVisible(true)されたとき)にrequestFocusInWindow()を実行
 
- フレームに
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 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();
    }
  }
});