Windowを開いたときのフォーカスを指定
Total: 55830, Today: 1, Yesterday: 2
Posted by aterai at
Last-modified:
Summary
JFrameやJDialogなどのWindowを開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。
Screenshot

Advertisement
Source Code Examples
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
field.requestFocusInWindow();
}
});
View in GitHub: Java, KotlinDescription
上記のサンプルでは、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();
}
}
});