JOptionPane 总是返回 -1

JOptionPane always returning -1

我想仔细检查删除操作以防止误删。

(这里的是按钮只有在复选框被选中时才会启用。)

但是是和否按钮都返回 -1。

这是我的程序片段。

public class class1 extends javax.swing.JInternalFrame {

JCheckBox cbConfirmDelete;

JPanel outer = new JPanel(new BorderLayout());
final JButton btnYes = new JButton("Yes");
final JButton btnNo = new JButton("No");

public class1() {

    ......

    //Button btnYes ActionListener for JOptionPane
    btnYes.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane pane = getOptionPane((JComponent) e.getSource());
            pane.setValue(btnYes);
        }
    });

    //Button btnNo ActionListener for JOptionPane
    btnNo.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane pane = getOptionPane((JComponent) e.getSource());
            pane.setValue(btnNo);
        }
    });

    //layout for JOptionPane
    JPanel nested1 = new JPanel();
    nested1.add(cbConfirmDelete);

    JPanel nested2 = new JPanel();
    nested2.add(btnYes);
    nested2.add(btnNo);

    outer.add(nested1, BorderLayout.NORTH);
    outer.add(nested2, BorderLayout.CENTER);
}

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

private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {                                          
    int dialogResult = JOptionPane.showOptionDialog(null, "Are you sure you want to Delete the Reference ?", "Delete Reference", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[]{outer}, btnYes);
    System.out.println("DialogResult: " + dialogResult);
}                                         
}

输出对话框结果总是-1。为什么会这样?

如果我在 JOptionPane 中传递以下对象,它工作正常..

new Object[]{cbConfirmDelete, btnYes, btnNo}

但这不起作用

new Object[]{outer}

我看到这里有几个问题。由于您正在创建一个 Yes/No 选项对话框,因此您的 Object[] 数组应该包含两个且仅包含两个对应于是或否的组件。

  1. 对于您的示例,您的 Object[] 数组包含复选框、是按钮和否按钮。那是一个太多的组件。当您在是或否动作侦听器中设置窗格值时,您将其设置为 1 或 2 而不是 0 或 1,因为在位置上,这些组件是第二个和第三个。这不一定是个大问题,但通常当您从 yes/no 对话框中 return 时,您会检查 JOptionPane.YES_OPTION (0) 或 JOptionPane.NO_OPTION (1) 以查看如果用户选择是或否。在您的场景中,您将不得不检查 1 或 2,因为复选框是组件 0。

  2. 对于您的非工作场景,问题是您的对象数组只包含一个对象,外部面板包含复选框和 yes/no 按钮。从技术上讲,发生的事情是您告诉选项窗格只有一个可选组件,即 JPanel。使用外部面板以外的任何组件调用 pane.setValue() 都不会产生任何效果,因为面板的选择值一开始就是 -1(未初始化的值),并且只有在调用 setValue(outer) 时它才会更改。