TITLE:JOptionPaneのデフォルトフォーカス
Posted by terai at 2009-11-23

JOptionPaneのデフォルトフォーカス

JOptionPaneにデフォルトでフォーカスをもつコンポーネントを追加します。
  • 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

概要

JOptionPaneにデフォルトでフォーカスをもつコンポーネントを追加します。

#screenshot

サンプルコード

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

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

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

解説

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

解説

上記のサンプルでは、JOptionPane.showConfirmDialogで表示するJTextFieldにデフォルトのフォーカスがあたるように設定しています。
  • 左上
    • デフォルト
  • 右上
    • JOptionPane#createDialog(...)でJDialogを取得し、WindowListener#windowOpenedで、textField.requestFocusInWindow()
  • 左上: Default
    • デフォルトのConfirmDialogの場合、初期フォーカスは入力欄ではなくOKボタンにある
      #spanend
      #spanadd
      int result = JOptionPane.showConfirmDialog(
      #spanend
          frame, textField, "Input Text",
          JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
      #spanadd
      if (result == JOptionPane.OK_OPTION) {
      #spanend
        textArea.setText(textField.getText());
      #spanadd
      }
      #spanend
      #spanadd
      
  • 右上: WindowListener
  • 左下
    • textFieldにHierarchyListenerを追加し、hierarchyChangedが呼ばれたときに、textField.requestFocusInWindow()
  • 右下
    • textFieldにaddAncestorListenerを追加し、ancestorAddedが呼ばれたときに、textField.requestFocusInWindow()
    • Swing - Input focus
      #spanend
      #spanadd
      JOptionPane pane = new JOptionPane(
      #spanend
          textField, JOptionPane.PLAIN_MESSAGE,
          JOptionPane.OK_CANCEL_OPTION, null, null, null);
      #spanadd
      JDialog dialog = pane.createDialog(frame, "Input Text");
      #spanend
      #spanadd
      dialog.addWindowListener(new WindowAdapter() {
      #spanend
        @Override public void windowOpened(WindowEvent e) {
          textField.requestFocusInWindow();
        }
      #spanadd
      });
      #spanend
      #spanadd
      dialog.setVisible(true);
      #spanend
      #spanadd
      Object selectedValue = pane.getValue();
      #spanend
      #spanadd
      int result = JOptionPane.CLOSED_OPTION;
      #spanend
      #spanadd
      if (selectedValue != null && selectedValue instanceof Integer) {
      #spanend
        result = ((Integer) selectedValue).intValue();
      #spanadd
      }
      #spanend
      #spanadd
      if (result == JOptionPane.OK_OPTION) {
      #spanend
        textArea.setText(textField.getText());
      #spanadd
      }
      #spanend
      #spanadd
      

参考リンク

  • Windowを開いたときのフォーカスを指定など
  • Swing - Input focus
  • 左下: HierarchyListener
    • textFieldHierarchyListenerを追加しhierarchyChangedが呼ばれたときにtextField.requestFocusInWindow();を実行
      #spanend
      #spanadd
      textField3.addHierarchyListener(new HierarchyListener() {
      #spanend
        @Override public void hierarchyChanged(HierarchyEvent e) {
          if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0
               && textField3.isShowing()) {
            EventQueue.invokeLater(new Runnable() {
              @Override public void run() {
                textField3.requestFocusInWindow();
              }
            });
          }
        }
      #spanadd
      });
      #spanend
      #spanadd
      int result = JOptionPane.showConfirmDialog(
      #spanend
          frame, textField3, "Input Text",
          JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
      #spanadd
      if (result == JOptionPane.OK_OPTION) {
      #spanend
        textArea.setText(textField3.getText());
      #spanadd
      }
      #spanend
      #spanadd
      

コメント

  • 右下: AncestorListener
    • textFieldaddAncestorListenerを追加しancestorAddedが呼ばれたときにtextField.requestFocusInWindow();を実行
    • Swing - Input focus

参考リンク

コメント