1

私は次のコードを持っています:

JTextField uname = new JTextField(defaultUser);
JPasswordField passwd = new JPasswordField();
JTextField serverAddress = new JTextField(defaultServer);
JTextField port = new JTextField(Integer.toString(defaultPort));
final JComponent[] inputs = new JComponent[]{new JLabel("Username"), uname, new JLabel("Password"), passwd, new JLabel("Server Address"), serverAddress, new JLabel("Server Port"), port};


int var = JOptionPane.showConfirmDialog(parent, inputs, "Enter Connection Details", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (var != 0) {
    return;
}
....

これにより、サーバーに接続するための詳細を求めるダイアログボックスが作成されます。私が欲しいのは、パスワードフィールドをデフォルトで選択されるようにすることです。つまり、カーソルはデフォルトでそこにあるので、最初にパスワードボックスを選択する必要はなく、ペインが表示されたらすぐに入力を開始できます。デフォルトでは、[OK]ボタンにフォーカスがあります。

passwd.requestFocusInWindow()を試しましたが、機能しません(ボックスを呼び出す前に、ボックスを表示する必要があると考えているため)。また、passwdのrequestFocusメソッドをさまざまなコンテンツでオーバーライドしようとしましたが、どちらも実行されませんでした(おそらく、とにかく呼び出されないためです...)。

注:他のJOptionPaneメソッドのいくつかにはデフォルト値パラメーターがあることは知っていますが、入力ボックスのレイアウトに問題があるため、私には適していません。

誰かアイデアがありますか?それは取引を妨げるものではないので、簡単にできなくても私はそれほど腹を立てることはありません。

乾杯

4

1 に答える 1

0

ComponentListenerをパスワードフィールドに追加してみてください。パスワードフィールドが表示されたら、#requestFocusInWindowを呼び出します。

更新: JOptionPaneダイアログの[OK]ボタンをデフォルトにし、ダイアログが表示されたときにフォーカスを合わせます。したがって、解決策はそれほど明白ではありません...HierarchyListenerパスワードフィールドがダイアログに追加されるまで待ってから、ダイアログにJRootPaneデフォルトのボタンがあるかどうかを確認し、あるFocusListener場合は、ボタンが永続的なフォーカススイッチフォーカスを取得したときに追加する必要がありますパスワードフィールドへ:

import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
import static javax.swing.JOptionPane.PLAIN_MESSAGE;

import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JRootPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class FocusPasswordFieldInOptionPaneDemo implements Runnable
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new FocusPasswordFieldInOptionPaneDemo());
    }

    @Override
    public void run()
    {
        JTextField uname = new JTextField("user");
        JPasswordField passwd = new JPasswordField();
        JTextField serverAddress = new JTextField("server");
        JTextField port = new JTextField(Integer.toString(1337));
        final JComponent[] inputs = new JComponent[] {new JLabel("Username"), uname, new JLabel("Password"), passwd,
                new JLabel("Server Address"), serverAddress, new JLabel("Server Port"), port};

        makeSurePasswordFieldGetsFocus(passwd);

        int answer = JOptionPane.showConfirmDialog(null, inputs, "Enter Connection Details", OK_CANCEL_OPTION, PLAIN_MESSAGE);
        System.out.println(answer);
    }

    /**
     * {@link JOptionPane} makes the [OK] button default in the dialog and makes it focused.
     * <p>
     * So via a couple of listeners we can wait until the button gets permanent focus and then switch focus to the password field.
     */
    private void makeSurePasswordFieldGetsFocus(final JPasswordField passwd)
    {
        passwd.addHierarchyListener(new HierarchyListener()
        {
            HierarchyListener hierarchyListener = this;

            @Override
            public void hierarchyChanged(HierarchyEvent e)
            {
                JRootPane rootPane = SwingUtilities.getRootPane(passwd);
                if (rootPane != null)
                {
                    final JButton okButton = rootPane.getDefaultButton();
                    if (okButton != null)
                    {
                        okButton.addFocusListener(new FocusAdapter()
                        {
                            @Override
                            public void focusGained(FocusEvent e)
                            {
                                if (!e.isTemporary())
                                {
                                    passwd.requestFocusInWindow();
                                    passwd.removeHierarchyListener(hierarchyListener);
                                    okButton.removeFocusListener(this);
                                }
                            }
                        });
                    }
                }
            }
        });
    }
}

このソリューションは機能しますが、少しハッキーです...別の方法は、@syb0rgの回答のようなカスタムの「DatabaseConnectionDialog」を作成することです。

于 2012-12-31T00:44:29.263 に答える