Swing/OptionPaneDefaultFocus の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/OptionPaneDefaultFocus へ行く。
- Swing/OptionPaneDefaultFocus の差分を削除
--- 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 --- * 概要 [#summary] `JOptionPane`にデフォルトでフォーカスをもつコンポーネントを追加します。 #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTQoUaDrDI/AAAAAAAAAf4/nUnrCrmb5io/s800/OptionPaneDefaultFocus.png) * サンプルコード [#sourcecode] #code(link){{ textField4.addAncestorListener(new AncestorListener() { @Override public void ancestorAdded(AncestorEvent e) { e.getComponent().requestFocusInWindow(); } @Override public void ancestorMoved(AncestorEvent e) { /* not needed */ } @Override public void ancestorRemoved(AncestorEvent e) { /* not needed */ } }); }} * 解説 [#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()); } }} - 右上: `WindowListener` -- `JOptionPane#createDialog(...)`で`JDialog`を取得し、`WindowListener#windowOpened`で`textField.requestFocusInWindow();`を実行 -- `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); 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 (result == JOptionPane.OK_OPTION) { textArea.setText(textField.getText()); } }} - 左下: `HierarchyListener` -- `textField`に`HierarchyListener`を追加し、`hierarchyChanged`が呼ばれたときに`textField.requestFocusInWindow();`を実行 -- `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() { @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()); } }} - 右下: `AncestorListener` -- `textField`に`addAncestorListener`を追加し、`ancestorAdded`が呼ばれたときに`textField.requestFocusInWindow();`を実行 -- `textField`に`addAncestorListener`を追加し`ancestorAdded`が呼ばれたときに`textField.requestFocusInWindow();`を実行 -- [https://community.oracle.com/thread/1354218 Swing - Input focus] * 参考リンク [#reference] - [[Windowを開いたときのフォーカスを指定>Swing/DefaultFocus]] - [https://community.oracle.com/thread/1354218 Swing - Input focus] * コメント [#comment] #comment #comment