I get only null from: Object selectedValue = jPane

2019-03-05 03:53发布

问题:

    private void cancelButtonPressed() {  
    jPane = new JOptionPane("quit?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION, null, buttons, buttons[1]);
    jPane.setName("WPane");
    dialog = jPane.createDialog(jPane.getParent(), "Confirm Dialog");

    dialog.setVisible(true);
    dialog.dispose();

    Object selectedValue = jPane.getValue();
    System.out.println("selectedValue:" + selectedValue);
    if(selectedValue == null)
        System.out.println("selectedValue:" + selectedValue);
        //return CLOSED_OPTION;
    if(buttons == null) {
        if(selectedValue instanceof Integer) {
            //return ((Integer)selectedValue).intValue();
            System.out.println("selectedValue instanceof Integer, selectedValue:" + selectedValue);
        //return CLOSED_OPTION;
        }
    }
    for(int counter = 0, maxCounter = buttons.length;
        counter < maxCounter; counter++) {
        if(buttons[counter].equals(selectedValue)){
            System.out.println("buttons[counter].equals(selectedValue) selectedValue:" + selectedValue);
            //return counter;
        }
    }
    //return CLOSED_OPTION;
}

in the constructor I set the names of the buttons:

    buttons[0]= new JButton("Yes");
    buttons[1]= new JButton("No");
    buttons[0].setName("Yes_Next_Btn");
    buttons[1].setName("No_Back_Btn");

The problem was, that I need to setNames to the components: JOptionPane, and the buttons. So that I don't use : JOptionPane.showConfirmDialog.

And in this case: When I click on the buttons(Yes,No) I don't get any value, only if I click on the "X", for exit I get null.

回答1:

If you put JButtons as options into the JOptionPane, then YOU need to specify what happens when they are clicked. Since you don't appear to have any Action or ActionListener bound to your buttons, nothing happens.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class JOptionPaneTest {

    public void createAndShowJOptionPane() {
        final JButton b1 = new JButton("Yes, please");
        b1.setName("yes_please");
        final JButton b2 = new JButton("No, thx");
        b2.setName("no_thx");
        final JButton b3 = new JButton("Leave me alone");
        b3.setName("leave_me_alone");
        Object[] options = new Object[]{b1, b2, b3};

        final JOptionPane optionPane = new JOptionPane("Message", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
        final JDialog dialog = optionPane.createDialog("Title");
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(b1.getText());
                optionPane.setValue(0);
                dialog.dispose();
            }
        });
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(b2.getText());
                optionPane.setValue(1);
                dialog.dispose();
            }
        });
        b3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(b3.getText());
                optionPane.setValue(2);
                dialog.dispose();
            }
        });
        dialog.setVisible(true);

        if ((Integer)optionPane.getValue() == 0) {
            System.out.println("Woohoo!");
        }
    }

    public static void main(String[] argv) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JOptionPaneTest test = new JOptionPaneTest();
                test.createAndShowJOptionPane();
            }
        });
    }
}


回答2:

The problem is, the JOptionPane doesn't add any listeners to the buttons, so when you click on them, nothing happens.

Try replacing the buttons with Strings instead...

public class TestOptionPane06 {

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

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

//                JButton buttons[] = new JButton[2];
//                
//                buttons[0] = new JButton("Yes");
//                buttons[1] = new JButton("No");
//                buttons[0].setName("Yes_Next_Btn");
//                buttons[1].setName("No_Back_Btn");

                String values[] = new String[2];
                values[0] = "Yes";
                values[1] = "No";

                JOptionPane jPane = new JOptionPane("quit?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION, null, values, values[1]);
                jPane.setName("WPane");
                JDialog dialog = jPane.createDialog(jPane.getParent(), "Confirm Dialog");

                dialog.setVisible(true);
                dialog.dispose();

                Object selectedValue = jPane.getValue();
                System.out.println("selectedValue:" + selectedValue);
                if (selectedValue == null) {
                    System.out.println("selectedValue:" + selectedValue);
                }
                //return CLOSED_OPTION;
                if (values == null) {
                    if (selectedValue instanceof Integer) {
                        //return ((Integer)selectedValue).intValue();
                        System.out.println("selectedValue instanceof Integer, selectedValue:" + selectedValue);
                        //return CLOSED_OPTION;
                    }
                }
                for (int counter = 0, maxCounter = values.length;
                                counter < maxCounter; counter++) {
                    if (values[counter].equals(selectedValue)) {
                        System.out.println("buttons[counter].equals(selectedValue) selectedValue:" + selectedValue);
                        //return counter;
                    }
                }
            }

        });
    }

}