java - JOptionPane 始终返回 -1

标签 java joptionpane

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

JOptionPane

(此处"is"按钮仅在选中该复选框时才会启用。)

但是"is"和“否”按钮都返回 -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);
}                                         
}

输出 DialogResult 始终为 -1。为什么会这样?

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

new Object[]{cbConfirmDelete, btnYes, btnNo}

但这不起作用

new Object[]{outer}

最佳答案

我在这里看到几个问题。由于您要创建“是/否”选项对话框,因此您的 Object[] 数组应包含两个且仅两个与"is"或“否”相对应的组件。

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

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

关于java - JOptionPane 始终返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404643/

相关文章:

java - JAVA数组内不重复的随机数

java - compareTo 是否有某种预启动延迟?

JAVA:如何将消息框与多个输出结合起来

java - 如何编写自定义 JOptionPane 按钮?

java - 禁用 Netbeans GUI 中的按钮,直到将正确的密码输入密码字段

java - 保存多选 ListView 的状态

java - bazel - 测试运行时的可写归档路径

java - 验证 JOptionPane.ShowInputDialog 中的用户输入

java - JOptionPane 显示消息

java - Struts 中的 JOptionPane?