JButton结合JSpinner的if-else条件判断else分支不生效问题
Swing计时器默认短休息时长分支不触发修复方案
问题根因
你写的分支逻辑存在两处硬伤,导致else分支永远不可能执行:
- 条件互斥矛盾:只要UI完成初始化,
spinnerShortBreak组件实例就一定不为null,你写的spinnerShortBreak == null判断永远返回false;就算极端情况下组件真为null,后续紧跟的spinnerShortBreak.getValue()会直接抛出空指针,根本走不到分支内的逻辑。 - 判断依据不可靠:靠
spinnerShortBreak.getModel().getValue().equals(value2)区分是否自定义完全不准——JSpinner初始化加载默认值时就会触发ChangeListener给value2赋值,且你没有给value2设置初始默认值,会直接导致分支判断错乱。另外原代码自定义分支没有重置秒数显示,就算分支走对也会出现秒数残留的显示bug。
修复步骤
- 在类的成员变量区域新增自定义状态标记,同时给短休息时长设置默认值:
// 标记用户是否主动修改过短休息时长 private boolean isShortBreakCustomized = false; // 默认短休息时长对齐要求的5分钟 private int value2 = 5;
- 修改JSpinner的变更监听器,只要用户调整过Spinner数值,就标记为已自定义:
spinnerShortBreak.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { value2 = Integer.parseInt(String.valueOf(spinnerShortBreak.getValue())); isShortBreakCustomized = true; } });
- 重写Short Break按钮的点击逻辑,删掉永远不成立的null判断,通过状态标记区分分支,同时补全秒数重置逻辑:
btnShortBreak.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { timer.stop(); second = 0; if (isShortBreakCustomized) { // 已自定义:使用用户设置的时长 minute = value2; lblMinute.setText(String.valueOf(value2)); } else { // 未自定义:使用默认5分钟时长 minute = 5; btnStartStop.setText("Start"); lblMinute.setText("05"); } // 所有分支都需要重置秒数为00 lblSecond.setText("00"); } });
如果需要重置回默认状态(比如用户点了重置按钮),直接把isShortBreakCustomized设回false即可。
内容的提问来源于stack exchange,提问作者MK.Whridoy
相关产品推荐
相关产品推荐

