• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: OptionPaneDefaultFocus
title: JOptionPaneのデフォルトフォーカス
tags: [JOptionPane, Focus, JComponent, WindowListener, HierarchyListener, AncestorListener]
author: aterai
pubdate: 2009-11-23T19:41:03+09:00
description: JOptionPaneにデフォルトでフォーカスをもつコンポーネントを追加します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTQoUaDrDI/AAAAAAAAAf4/nUnrCrmb5io/s800/OptionPaneDefaultFocus.png
---
* 概要 [#p8003f6b]
* 概要 [#summary]
`JOptionPane`にデフォルトでフォーカスをもつコンポーネントを追加します。

#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTQoUaDrDI/AAAAAAAAAf4/nUnrCrmb5io/s800/OptionPaneDefaultFocus.png)

* サンプルコード [#nd2fa665]
* サンプルコード [#sourcecode]
#code(link){{
textField4.addAncestorListener(new AncestorListener() {
  @Override public void ancestorAdded(AncestorEvent e) {
    e.getComponent().requestFocusInWindow();
  }
  @Override public void ancestorMoved(AncestorEvent e) {}
  @Override public void ancestorRemoved(AncestorEvent e) {}

  @Override public void ancestorMoved(AncestorEvent e) {
    /* not needed */
  }

  @Override public void ancestorRemoved(AncestorEvent e) {
    /* not needed */
  }
});
}}

* 解説 [#k9a64d2f]
* 解説 [#explanation]
上記のサンプルでは、`JOptionPane.showConfirmDialog`で表示する`JTextField`にデフォルトのフォーカスがあたるように設定しています。

- 左上
-- デフォルト

- 左上: `Default`
-- デフォルトの`ConfirmDialog`の場合、初期フォーカスは入力欄ではなく`OK`ボタンにある
#code{{
int result = JOptionPane.showConfirmDialog(frame, textField, "Input Text",
                 JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if(result==JOptionPane.OK_OPTION) textArea.setText(textField.getText());
int result = JOptionPane.showConfirmDialog(
    frame, textField, "Input Text",
    JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
  textArea.setText(textField.getText());
}
}}

- 右上
-- `JOptionPane#createDialog(...)`で`JDialog`を取得し、`WindowListener#windowOpened`で、`textField.requestFocusInWindow();`
- 右上: `WindowListener`
-- `JOptionPane#createDialog(...)`で`JDialog`を取得し`WindowListener#windowOpened`で`textField.requestFocusInWindow();`を実行
-- [[Windowを開いたときのフォーカスを指定>Swing/DefaultFocus]]など

#code{{
JOptionPane pane = new JOptionPane(textField, JOptionPane.PLAIN_MESSAGE,
                                   JOptionPane.OK_CANCEL_OPTION, null, null, null);
JOptionPane pane = new JOptionPane(
    textField, JOptionPane.PLAIN_MESSAGE,
    JOptionPane.OK_CANCEL_OPTION, null, null, null);
JDialog dialog = pane.createDialog(frame, "Input Text");
dialog.addWindowListener(new WindowAdapter() {
  @Override public void windowOpened(WindowEvent e) {
    textField.requestFocusInWindow();
  }
});
dialog.setVisible(true);
Object selectedValue = pane.getValue();
int result = JOptionPane.CLOSED_OPTION;
if(selectedValue != null && selectedValue instanceof Integer) {
  result = ((Integer)selectedValue).intValue();
if (selectedValue != null && selectedValue instanceof Integer) {
  result = ((Integer) selectedValue).intValue();
}
result==JOptionPane.OK_OPTION) textArea.setText(textField.getText());
if (result == JOptionPane.OK_OPTION) {
  textArea.setText(textField.getText());
}
}}

- 左下
-- `textField`に`HierarchyListener`を追加し、`hierarchyChanged`が呼ばれたときに、`textField.requestFocusInWindow();`

- 左下: `HierarchyListener`
-- `textField`に`HierarchyListener`を追加し`hierarchyChanged`が呼ばれたときに`textField.requestFocusInWindow();`を実行
#code{{
textField3.addHierarchyListener(new HierarchyListener() {
  @Override public void hierarchyChanged(HierarchyEvent e) {
    if((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED)!=0
       && textField3.isShowing()) {
      EventQueue.invokeLater(new Runnable(){
    if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0
         && textField3.isShowing()) {
      EventQueue.invokeLater(new Runnable() {
        @Override public void run() {
          textField3.requestFocusInWindow();
        }
      });
    }
  }
});
int result = JOptionPane.showConfirmDialog(frame, textField3, "Input Text",
                 JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if(result==JOptionPane.OK_OPTION) textArea.setText(textField3.getText());
int result = JOptionPane.showConfirmDialog(
    frame, textField3, "Input Text",
    JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
  textArea.setText(textField3.getText());
}
}}

- 右下
-- `textField`に`addAncestorListener`を追加し、`ancestorAdded`が呼ばれたときに、`textField.requestFocusInWindow();`
- 右下: `AncestorListener`
-- `textField`に`addAncestorListener`を追加し`ancestorAdded`が呼ばれたときに`textField.requestFocusInWindow();`を実行
-- [https://community.oracle.com/thread/1354218 Swing - Input focus]

* 参考リンク [#u3c4a8af]
* 参考リンク [#reference]
- [[Windowを開いたときのフォーカスを指定>Swing/DefaultFocus]]
- [https://community.oracle.com/thread/1354218 Swing - Input focus]

* コメント [#nef3f20f]
* コメント [#comment]
#comment
#comment