Java中JOptionPane按钮能否返回非连续自定义数值?
问题1:JOptionPane自定义选项的返回值是否必须连续?
JOptionPane的showOptionDialog原生返回值默认是连续整数,返回值等于你选中的选项在传入的options数组中的下标,从0开始递增,点击窗口关闭按钮时固定返回JOptionPane.CLOSED_OPTION(值为-1),原生机制不支持直接返回非连续的自定义整数。
要实现非连续返回的需求非常简单,你可以自己加一层索引映射即可,示例逻辑如下:
// 定义你想要的非连续返回值,顺序对应选项按钮的顺序 int[] returnMapping = {2, 7}; // 自定义选项数组 Object[] options = {"选项1(返2)", "选项2(返7)"}; int rawIndex = JOptionPane.showOptionDialog(null, "测试问题", "标题", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); // 排除关闭窗口的情况,映射为你要的非连续值 int option; if (rawIndex == JOptionPane.CLOSED_OPTION) { option = -1; // 自定义关闭对应的返回值 } else { option = returnMapping[rawIndex]; }
映射后的option值可以是任意你设定的非连续整数,完全适配你用switch-case做分支控制的需求。
问题2:自定义选项时是否支持if (option == JOptionPane.NO_OPTION)这类判断?
只有你使用showConfirmDialog、showMessageDialog这类预定义按钮的对话框时,才会返回JOptionPane.YES_OPTION、JOptionPane.NO_OPTION这类预设常量。
如果你是自定义options数组调用showOptionDialog,除了关闭窗口返回的JOptionPane.CLOSED_OPTION是通用可用的,其他YES/NO/CANCEL_OPTION这类常量都不会被返回,也不建议用来做判断。
问题3:是否适配switch-case分支结构?
完全适配。无论是原生返回的连续索引,还是你自己映射后的非连续整数,只要是int类型值都可以直接作为switch的判断条件,你示例中的写法调整映射逻辑后可以直接运行,参考调整后的示例:
int option = JOptionPane.showOptionDialog(/* 第一个对话框的参数 */); while (playThis == 1) { switch (option) { case 1: Object[] options1 = {"选项A(返1)", "选项B(返5)"}; int[] map1 = {1,5}; int raw1 = JOptionPane.showOptionDialog(null, "问题1", "标题", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options1, options1[0]); option = raw1 == JOptionPane.CLOSED_OPTION ? -1 : map1[raw1]; break; case 2: Object[] options2 = {"选项X(返2)", "选项Y(返3)", "选项Z(返4)"}; int[] map2 = {2,3,4}; int raw2 = JOptionPane.showOptionDialog(null, "问题2", "标题", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options2, options2[0]); option = raw2 == JOptionPane.CLOSED_OPTION ? -1 : map2[raw2]; break; // 其他分支逻辑 } }
内容的提问来源于stack exchange,提问作者Kas
相关产品推荐
相关产品推荐

