在JOptionPane.dialog上禁用ok按钮,直到用户输入

时间:2013-01-15 09:47:14

标签: java swing joptionpane

我需要用户输入名称,我想禁用确定按钮,直到给出一些输入。如何禁用它??

4 个答案:

答案 0 :(得分:22)

JOptionPane允许您提供组件作为消息窗格以及可在其上显示的控件/选项。

如果向消息组件添加正确的侦听器,那么您应该能够影响用作选项的控件。

查看JOptionPane.showOptionDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] 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);
            }
        });
    }
}

答案 1 :(得分:1)

据我所知,如果不覆盖JOptionPane,这是不可能的。

答案 2 :(得分:0)

尝试为Java搜索 swinglabs jGoodies 库。它们内置了你需要的东西。

答案 3 :(得分:0)

  

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

错误的做法。

即。定义'什么是名字'=可以是任何东西。

所以,你实际上试图做的不是接受一个空字符串,

并按“确定”按钮后执行错误检查。

如果为空 - 弹出错误消息/重复输入请求/确认取消/无论你想做什么