Java 禁用JOptionPane.dialog上的“确定”按钮,直到用户提供输入

Java 禁用JOptionPane.dialog上的“确定”按钮,直到用户提供输入,java,swing,joptionpane,Java,Swing,Joptionpane,我需要用户输入一个名称,我想禁用ok按钮,直到给出一些输入。我怎样才能禁用它 尝试搜索swinglabs或jGoodiesJava库。他们为您所需的东西内置了类型。据我所知,如果不覆盖JOptionPaneJOptionPane允许您提供一个组件作为消息窗格以及可以在其上显示的控件/选项,这是不可能的 如果将正确的侦听器添加到消息组件,则应该能够影响用作选项的控件 看看 已更新 例如 public class TestOptionPane05 { public static void

我需要用户输入一个名称,我想禁用ok按钮,直到给出一些输入。我怎样才能禁用它

尝试搜索swinglabsjGoodiesJava库。他们为您所需的东西内置了类型。

据我所知,如果不覆盖
JOptionPane
JOptionPane
允许您提供一个组件作为消息窗格以及可以在其上显示的控件/选项,这是不可能的

如果将正确的侦听器添加到消息组件,则应该能够影响用作选项的控件

看看

已更新

例如

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);
            }
        });
    }
}

我需要用户输入一个名称,我想禁用ok按钮,直到给出一些输入

做这件事的方法是错误的

i、 e.定义“什么是名字”=可以是任何东西

实际上,你要做的是不接受空字符串

在按下“确定”按钮后,作为错误检查执行此操作


如果为空-弹出错误消息/重复输入请求/确认取消/您想做的任何事情

对我都有效。谢谢你,伙计!我希望你仍然很活跃,能回答我的问题。为什么我们需要
getOptionPanel
方法?我曾尝试为
OptionPanel
设置一个变量,并在
ActionListener
中使用该变量调用
setValue
,但直到我实现了你的
getOptionPanel
方法,它才起作用。好吧,猜猜看,有时候你的客户会想要Sanziana所描述的东西。所以去告诉他这是“错误的做法”: