Подтвердить что ты не робот

Отключить кнопку ok на JOptionPane.dialog, пока пользователь не даст вход

Мне нужно, чтобы пользователь вводил имя, и я хочу отключить кнопку ok, пока не будет указан какой-либо ввод. Как я могу отключить его...?

4b9b3361

Ответ 1

JOptionPane позволяет вам указать компонент как панель сообщений и элементы управления/параметры, которые могут отображаться на нем.

Если вы добавляете правильных слушателей к компоненту сообщения, вы должны иметь возможность влиять на элементы управления, которые используются в качестве параметров.

Взгляните на JOptionPane.showOptionDialog(компонент parentComponent, сообщение объекта, заголовок строки, int optionType, int messageType, значок значка, объект [] options, Object InitialValue)

Обновление

Например...

enter image description here

public class TestOptionPane05 {

    public static void main(String[] args) {
        new TestOptionPane05();
    }

    protected JOptionPane getOptionPane(JComponent parent) {
        JOptionPane pane = null;
        if (!(parent instanceof JOptionPane)) {
            pane = getOptionPane((JComponent)parent.getParent());
        } else {
            pane = (JOptionPane) parent;
        }
        return pane;
    }

    public TestOptionPane05() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JButton okay = new JButton("Ok");
                okay.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JOptionPane pane = getOptionPane((JComponent)e.getSource());
                        pane.setValue(okay);
                    }
                });
                okay.setEnabled(false);
                final JButton cancel = new JButton("Cancel");
                cancel.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JOptionPane pane = getOptionPane((JComponent)e.getSource());
                        pane.setValue(cancel);
                    }
                });

                final JTextField field = new JTextField();
                field.getDocument().addDocumentListener(new DocumentListener() {
                    protected void update() {
                        okay.setEnabled(field.getText().length() > 0);
                    }

                    @Override
                    public void insertUpdate(DocumentEvent e) {
                        update();
                    }

                    @Override
                    public void removeUpdate(DocumentEvent e) {
                        update();
                    }

                    @Override
                    public void changedUpdate(DocumentEvent e) {
                        update();
                    }
                });

                JOptionPane.showOptionDialog(
                                null, 
                                field, 
                                "Get", 
                                JOptionPane.YES_NO_OPTION, 
                                JOptionPane.QUESTION_MESSAGE, 
                                null, 
                                new Object[]{okay, cancel}, 
                                okay);
            }
        });
    }
}

Ответ 2

Насколько я знаю, это невозможно без переопределения JOptionPane.

Ответ 3

Попробуйте найти библиотеки swinglabs или jGoodies для Java. Они имеют встроенный тип для того, что вам нужно.

Ответ 4

Мне нужно, чтобы пользователь вводил имя, и я хочу отключить кнопку ok, пока не будет указан какой-либо ввод.

неправильный способ сделать это.

то есть. define 'what is name' = может быть что угодно.

Итак, что вы пытаетесь сделать, это не принять пустую строку,

и вы делаете это как проверку ошибок после нажатия кнопки OK.

если пусто - всплывающее сообщение об ошибке/запрос повторного ввода/подтверждение отмены/все, что вы хотите сделать