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

Posted by aterai at 2009-11-23

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

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

  • &jnlp;
  • &jar;
  • &zip;
OptionPaneDefaultFocus.png

サンプルコード

textField4.addAncestorListener(new AncestorListener() {
  public void ancestorAdded(AncestorEvent event) {
    textField4.requestFocusInWindow();
  }
  public void ancestorMoved(AncestorEvent event) {}
  public void ancestorRemoved(AncestorEvent event) {}
});

解説

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

  • 左上
    • デフォルト
      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()
    • Windowを開いたときのフォーカスを指定など
      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();
      }
      result==JOptionPane.OK_OPTION) textArea.setText(textField.getText());
      
  • 左下
    • textFieldにHierarchyListenerを追加し、hierarchyChangedが呼ばれたときに、textField.requestFocusInWindow()
      textField3.addHierarchyListener(new HierarchyListener() {
        public void hierarchyChanged(HierarchyEvent e) {
          if((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED)!=0
             && textField3.isShowing()) {
            EventQueue.invokeLater(new Runnable(){
              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());
      
  • 右下
    • textFieldにaddAncestorListenerを追加し、ancestorAddedが呼ばれたときに、textField.requestFocusInWindow()
    • Swing - Input focus

参考リンク

コメント