我想仔细检查删除操作以防止意外删除。
(如果选中该复选框,则仅启用“是”按钮。)
但是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}
答案 0 :(得分:1)
我在这里看到了几个问题。由于您正在创建“是/否”选项对话框,因此您的Object []数组应包含两个且只有两个对应于yes或no的组件。
对于有效的示例,您的Object []数组包含复选框,yes按钮和no按钮。这是一个太多的组件。在yes或no动作侦听器中设置窗格值时,您将其设置为1或2而不是0或1,因为从位置上看,这些组件是第二个和第三个。这不一定是一个大问题,但通常当您从是/否对话框返回时,检查JOptionPane.YES_OPTION(0)或JOptionPane.NO_OPTION(1)以查看用户是否选择是或否。在您的方案中,由于复选框是组件0,您将不得不检查1或2.
对于非工作方案,问题是您的对象数组只包含一个对象,外部面板包含复选框和是/否按钮。从技术上讲,正在发生的事情是你告诉选项窗格,只有一个可选组件,即JPanel。使用除外部面板之外的任何组件调用pane.setValue()将不起作用,因为窗格的选择值为-1(未初始化的值),并且只有在调用setValue(外部)时才会更改。