-1

我想将此代码更改为仅显示“确定”并删除取消按钮。

Object contestacion5 = JOptionPane.showInputDialog(null, "#5 Que describe mejor a la Norteña?", "Examen Tijuanas PR", //3
            JOptionPane.DEFAULT_OPTION, null,
            new Object[] {"Ensalada de espinacas, tomates, zetas, cebolla, tocineta, aguacate, queso de hoja y tiras de maiz crujientes en vinagreta de la casa.",
            "Lechuga romana servida con tomate, cebolla, maiz, aguacate, queso de hoja y tiritas de maiz crujientes acompañado de su seleccion de filetes de pollo de res.", 
            "Ensalada vegetariana de nopales, tomates, cebolla, lechuga romana, queso de hoja, aguacate, y aderezo especial de la casa." }, null);

http://i.snag.gy/6nSlc.jpg 这是图片,我想要它,但没有取消按钮,谢谢!

4

1 回答 1

0

我做了一些实验。在下拉列表(组合框)中显示答案很容易,showInputDialog但似乎无法删除“取消”按钮。

相反,您可以使用showConfirmDialog,其中“消息”不是简单的字符串,而是包含以下内容的可视面板: (1) 问题的标签;(2) 答案的组合框。我已将其包装成一种方法以使其更易于使用:

static int showQuestion(String dialogTitle, String question, String[] answers) {
    JPanel panel = new JPanel(new BorderLayout());
    panel.add(new JLabel(question), BorderLayout.NORTH);
    JComboBox<String> comboBox = new JComboBox<>(answers);
    panel.add(comboBox);
    if (JOptionPane.CLOSED_OPTION == JOptionPane.showConfirmDialog(null, panel, dialogTitle, JOptionPane.DEFAULT_OPTION)) {
        return -1;
    }
    return comboBox.getSelectedIndex();
}

示例用法:

int choice = showQuestion("Examen Tijuanas PR", "#5 Que describe mejor a la Norteña?", new String[] {
    "Ensalada de espinacas, tomates, zetas, cebolla, tocineta, aguacate, queso de hoja y tiras de maiz crujientes en vinagreta de la casa.",
    "Lechuga romana servida con tomate, cebolla, maiz, aguacate, queso de hoja y tiritas de maiz crujientes acompañado de su seleccion de filetes de pollo de res.",
    "Ensalada vegetariana de nopales, tomates, cebolla, lechuga romana, queso de hoja, aguacate, y aderezo especial de la casa.",
});
System.out.println("User chose #" + choice);

showQuestion方法返回用户选择的答案的从 0 开始的索引。该对话框有一个“确定”按钮,但没有“取消”按钮;但是,仍然存在一个问题:用户仍然可以通过单击对话框的“X”或右键单击标题栏并从弹出菜单中选择“关闭”来关闭对话框。这与“取消”具有相同的效果。因此,上面的代码会检查这一点,-1如果用户没有做出选择,则返回,因为他们以某种方式关闭了对话框而没有单击“确定”。

我看不到删除对话框关闭按钮的简单方法。无论如何这会很烦人,因为它会阻止他们关闭程序或取消测试。如果他们真的想要,最好让用户关闭/取消对话框,并酌情处理这种情况。

(●) A此外,将选项显示为单选按钮(这些东西: 、、、( ) B( ) C而不是下拉列表可能对用户更友好。这样,用户无需额外点击即可一次阅读所有选项。showQuestion如果您愿意,这是一种替代方法。(它会循环调用对话框,以防用户在单击“确定”之前没有选择任何选项。)

static int showQuestion(String dialogTitle, String question, String[] answers) {
    Box box = new Box(BoxLayout.Y_AXIS);
    box.add(new JLabel(question));

    JRadioButton[] radioButtons = new JRadioButton[answers.length];
    ButtonGroup buttonGroup = new ButtonGroup();
    for (int i = 0; i < answers.length; i++) {
        radioButtons[i] = new JRadioButton(answers[i]);
        buttonGroup.add(radioButtons[i]);
        box.add(radioButtons[i]);
    }

    for (;;) {
        if (JOptionPane.CLOSED_OPTION == JOptionPane.showConfirmDialog(null, box, dialogTitle, JOptionPane.DEFAULT_OPTION)) {
            return -1;
        }
        for (int i = 0; i < radioButtons.length; i++) {
            if (radioButtons[i].isSelected()) return i;
        }
    }
}

编辑:要直接返回答案而不是数组中的索引,请对上面的函数进行一些小的更改:

  1. 返回类型String而不是int.
  2. 返回null而不是-1当用户取消它时
  3. 返回answers[comboBox.getSelectedIndex()]而不是仅仅comboBox.getSelectedIndex()

所以它变成:

static String showQuestion(String dialogTitle, String question, String[] answers) {
    JPanel panel = new JPanel(new BorderLayout());
    panel.add(new JLabel(question), BorderLayout.NORTH);
    JComboBox<String> comboBox = new JComboBox<>(answers);
    panel.add(comboBox);
    if (JOptionPane.CLOSED_OPTION == JOptionPane.showConfirmDialog(null, panel, dialogTitle, JOptionPane.DEFAULT_OPTION)) {
        return null;
    }
    return answers[comboBox.getSelectedIndex()];
}

然后,原始代码段的等价物是:

Object contestacion5 = showQuestion("Examen Tijuanas PR", "#5 Que describe mejor a la Norteña?", new String[] {
    "Ensalada de espinacas, tomates, zetas, cebolla, tocineta, aguacate, queso de hoja y tiras de maiz crujientes en vinagreta de la casa.",
    "Lechuga romana servida con tomate, cebolla, maiz, aguacate, queso de hoja y tiritas de maiz crujientes acompañado de su seleccion de filetes de pollo de res.",
    "Ensalada vegetariana de nopales, tomates, cebolla, lechuga romana, queso de hoja, aguacate, y aderezo especial de la casa.",
});
于 2013-09-23T00:26:01.553 回答