TITLE:Windowを開いたときのフォーカスを指定

Windowを開いたときのフォーカスを指定

Posted by terai at 2004-10-11

概要

JFrameやJDialogなどのWindowを開いたときに、デフォルトでフォーカスを持つコンポーネントを指定します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

frame.getRootPane().setDefaultButton(eb);
EventQueue.invokeLater(new Runnable() {
  public void run() {
    field.requestFocusInWindow();
  }
});

解説

サンプルでは、JTextFieldがデフォルトのフォーカスを持つように、JComponent#requestFocusInWindowメソッドを使用しています。


JDK 1.4 以降なら、FocusTraversalPolicy を設定して、最初にフォーカスの当たるコンポーネントを指定する方法もあります。

frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
  @Override
  public Component getFirstComponent(Container focusCycleRoot) {
    return field;
  }
  //getDefaultComponentのデフォルト実装はgetFirstComponentをラップ
  //@Override
  //public Component getDefaultComponent(Container aContainer) {
  //  return field; //getFirstComponent(aContainer);
  //}
  //getInitialComponentのデフォルト実装はgetDefaultComponentを使用
  //@Override
  //public Component getInitialComponent(Window w) {
  //  return field;
  //}
});

参考リンク

コメント

  • JFrame#getRootPane()#setDefaultButton()は使用方法がよくわからない… -- terai
  • setDefaultButtonって、Enterしたときに押されたとみなすボタンだったかな…… --
  • なるほど、さっきやっと理解できました。JTextFieldなどを編集状態にしたあと、EnterするとsetDefaultButtonしたボタンが押されるのですね。 -- terai
  • というわけで、frame.getRootPane().setDefaultButton(eb);を追加してみました。上記のサンプルでは、中央のJTextFieldにフォーカスがある状態で、リターンキーを押すと、EASTボタンが押されたことになります。 -- terai