JOptionPane总是返回-1

时间:2015-05-22 19:36:29

标签: java joptionpane

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

JOptionPane

(如果选中该复选框,则仅启用“是”按钮。)

但是Yes和No Buttons都返回-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}

1 个答案:

答案 0 :(得分:1)

我在这里看到了几个问题。由于您正在创建“是/否”选项对话框,因此您的Object []数组应包含两个且只有两个对应于yes或no的组件。

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

  2. 对于非工作方案,问题是您的对象数组只包含一个对象,外部面板包含复选框和是/否按钮。从技术上讲,正在发生的事情是你告诉选项窗格,只有一个可选组件,即JPanel。使用除外部面板之外的任何组件调用pane.setValue()将不起作用,因为窗格的选择值为-1(未初始化的值),并且只有在调用setValue(外部)时才会更改。