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