Swing/DefaultFocus のバックアップの現在との差分(No.29)
- 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
を開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。
Screenshot
Advertisement
サンプルコード
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
field.requestFocusInWindow();
}
});
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTextField
がデフォルトのフォーカスを持つように、JComponent#requestFocusInWindow()
メソッドを使用しています。
上記のサンプルでは、JTextField
がデフォルトのフォーカスを持つようにJComponent#requestFocusInWindow()
メソッドを使用しています。
JComponent#requestFocusInWindow()
メソッドは、チュートリアル(How to Use the Focus Subsystem)にあるように、JFrame#pack()
、もしくはJFrame#setSize(...)
などでリサイズされた後(フォーカスを取得するコンポーネントのサイズが決まった後)で実行する必要があります。このため、このサンプルではEventQueue.invokeLater(...)
を使って待ち状態のすべてのイベントが処理された後で実行するようにしています。
-
JComponent#requestFocusInWindow()
メソッドはチュートリアル(How to Use the Focus Subsystem)にあるようにJFrame#pack()
、もしくはJFrame#setSize(...)
などでリサイズされた後(フォーカスを取得するコンポーネントのサイズが決まった後)で実行する必要がある - このため、このサンプルでは
EventQueue.invokeLater(...)
を使って待ち状態のすべてのイベントが処理された後で実行している
以下のように、
FocusTraversalPolicy
やWindowListener
を使う方法でも同様にデフォルトのフォーカスを持つコンポーネントを指定可能です。
-
FocusTraversalPolicy
を使用 - 以下のように
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();
}
}
});