Java Swing公式计算器switch始终执行case 0问题求助及invokeLater咨询
问题分析与修复方案
核心Bug原因
兄弟,你这问题一眼就能看出来——你白创建了shapePicker这个JComboBox组件!你实际是通过JOptionPane.showInputDialog弹出的下拉选择框让用户选图形的,但你却错误地去调用shapePicker.getSelectedIndex()获取索引。这个shapePicker根本没被用户操作过,它默认选中的就是第一个选项(索引0),所以不管用户选啥图形,switch永远只会进入case 0,自然每次都弹圆形半径的输入框。
修复代码
直接从JOptionPane的返回值里获取用户选择的选项,再匹配它在options数组中的索引就行,修复后的关键代码如下:
// 保存用户通过JOptionPane选择的结果 String shapechoice = (String) JOptionPane.showInputDialog( null, "Choose from the following options...", "Formula Calculator", JOptionPane.QUESTION_MESSAGE, null, options, options[0] ); // 找到用户选择的选项在数组中的索引 int shapepick = -1; for (int i = 0; i < options.length; i++) { if (options[i].equals(shapechoice)) { shapepick = i; break; } } // 执行switch逻辑前先判断用户是否有效选择(防止用户点取消) if (shapepick != -1) { switch(shapepick) { case 0: Secondary.CircleArea(); break; case 1: Secondary.TriangleArea(); break; case 2: Secondary.RectangleArea(); break; case 3: Secondary.CircleCircumference(); break; case 4: Secondary.CubeVolume(); break; case 5: Secondary.CylinderVolume(); break; case 6: Secondary.PyramidVolume(); break; default: break; } }
小提示:你也可以用
Arrays.asList(options).indexOf(shapechoice)来快速获取索引,但要记得处理shapechoice为null的情况(用户点击取消按钮时会返回null)。
关于SwingUtilities.invokeLater()的解释
这个方法是Swing编程的核心规范之一:
- Swing采用单线程模型,所有与UI相关的创建、更新操作都必须在**事件调度线程(EDT)**中执行,否则可能出现UI卡顿、渲染异常甚至线程安全问题。
invokeLater的作用就是把你传入的Runnable任务放到EDT的任务队列中,等待EDT空闲时执行。你把UI初始化逻辑放到Runnable里再用这个方法提交,是完全正确的Swing程序启动方式,能避免很多潜在的UI问题。
内容的提问来源于stack exchange,提问作者VTnav
相关产品推荐
相关产品推荐

