• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Windowを開いたときのフォーカスを指定
#navi(../)
*Windowを開いたときのフォーカスを指定 [#q0754f35]
Posted by [[terai]] at 2004-10-11

#contents

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

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#c961d3aa]
#code{{
frame.getRootPane().setDefaultButton(eb);
EventQueue.invokeLater(new Runnable() {
  public void run() {
    field.requestFocusInWindow();
  }
});
}}

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

----
JDK 1.4 以降なら、FocusTraversalPolicy を設定して、最初にフォーカスの当たるコンポーネントを指定する方法もあります。
#code{{
frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
  @Override
  public Component getFirstComponent(Container focusCycleRoot) {
    return field;
  }
  //getDefaultComponent でも同様(getFirstComponentをラップしている)
  //@Override
  //public Component getDefaultComponent(Container aContainer) {
  //  return field; //getFirstComponent(aContainer);
  //}
});
}}

**参考リンク [#z4f652d0]
-[[Focusの移動>Swing/FocusTraversal]]

**コメント [#x1950fff]
-JFrame#getRootPane()#setDefaultButton()は使用方法がよくわからない… -- [[terai]] 
-setDefaultButtonって、Enterしたときに押されたとみなすボタンだったかな…… --  &new{2004-10-14 (木) 23:21:53};
-なるほど、さっきやっと理解できました。JTextFieldなどを編集状態にしたあと、EnterするとsetDefaultButtonしたボタンが押されるのですね。 -- [[terai]] &new{2004-10-18 (月) 12:14:15};
-というわけで、frame.getRootPane().setDefaultButton(eb);を追加してみました。上記のサンプルでは、中央のJTextFieldにフォーカスがある状態で、リターンキーを押すと、EASTボタンが押されたことになります。 -- [[terai]] &new{2004-10-18 (月) 12:20:58};

#comment