Search code examples
javaswingjbuttonjoptionpane

JOptionPane Passing Custom Buttons


I'm trying to get the value returned by custom buttons passed to JOptionPane. However the buttons I pass don't return a value at all. Only when the exit button is pressed is a value of -1 returned. I need this because I am changing the properties of the buttons enabled or disabled. I assume I need the buttons to return some information to the JOptionPane in some way. Any idea?

    JButton button1= new JButton("Button 1");
    JButton button2= new JButton("Button 2");

    button1.setEnabled(false);

    int value = JOptionPane.showOptionDialog(null, "Heres a test message", "Test", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[]{button1, button2}, button1);
    JOptionPane.showMessageDialog(null, "You entered " + value);

Nb This is related to my previous question - JOptionPane Grey Out One Button

I tried setting the value of the buttons like you said but they never return OK or CANCEL.

Whenever checking the value of the buttons, they never return the value I set them too.

    JButton button1= new JButton("Button1");
    JButton button2= new JButton("Button2");

    button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane pane = getOptionPane((JComponent)e.getSource());
                // set the value of the option pane
                pane.setValue(JOptionPane.OK_OPTION);
            }
        });

    button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane pane = getOptionPane((JComponent)e.getSource());
                // set the value of the option pane
                pane.setValue(JOptionPane.CANCEL_OPTION);
            }
        });

      if (JOptionPane.showOptionDialog(null, "Pick a button", "Pick", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[]{button1, button2}, button1) == JOptionPane.OK_OPTION) {
           JOptionPane.showMessageDialog(null, "Button1");
      }
      else{
           JOptionPane.showMessageDialog(null, "Button2");
      }

See above, always I get the button2 popup no matter what.


Solution

  • In the example I linked to you previous question, the buttons use the JOptionPane#setValue method to set the return value. This allows you to continue using the API as normal, while providing you with the customisation your after.

                final JButton okay = new JButton("Ok");
                okay.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JOptionPane pane = getOptionPane((JComponent)e.getSource());
                        // set the value of the option pane
                        pane.setValue(JOptionPane.OK_OPTION);
                    }
                });
    

    Take a closer look at Disable ok button on JOptionPane.dialog until user gives an input

    Updated

    I've gone back through the code and correct the actionPerformed methods to enable it to return a valid value...

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

    The value returned by the index of the value in the options array (last parameter)

    So, for example...

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

    If the user clicks the okay button, the return value will be 0, or if they select the cancel button, it will be 1