我想仔细检查删除操作以防止误删除。
(此处"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"或“否”相对应的组件。
对于有效的示例,您的 Object[] 数组包含复选框、是按钮和否按钮。这是一个太多的组件。当您在 yes 或 no 操作监听器中设置 Pane 值时,您将其设置为 1 或 2,而不是 0 或 1,因为从位置上看,这些组件是第二个和第三个。这不一定是一个大问题,但通常当您从是/否对话框返回时,您会检查 JOptionPane.YES_OPTION (0) 或 JOptionPane.NO_OPTION (1) 以查看用户是否选择是或否。在您的场景中,您必须检查 1 或 2,因为复选框是组件 0。
对于您的非工作场景,问题是您的对象数组仅包含一个对象,外部面板包含复选框和是/否按钮。从技术上讲,发生的情况是您告诉选项 Pane 只有一个可选组件,即 JPanel。使用除外部面板之外的任何组件调用 pane.setValue() 都不会产生任何效果,因为 Pane 的选择值一开始就是 -1(未初始化值),并且只有在调用 setValue(outer) 时它才会更改。
关于java - JOptionPane 始终返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404643/