自定义SpinnerDateModel实现仅编辑时分的JSpinner编辑器问题
解决JSpinner仅支持时分编辑的编辑器问题
看起来你遇到的核心问题是:当使用仅显示时分的精简编辑器时,SpinnerDateModel的getNext/PreviousValue方法没有被触发,导致无法通过上下按钮或键盘编辑时分字段。这是因为默认的JSpinner.DateEditor在仅展示时分格式时,没有正确绑定对应的Calendar字段增减逻辑,而完整字段编辑器会自动处理不同时间字段的切换。
下面是具体的调整方案,帮你实现仅支持时分编辑的功能:
1. 明确SpinnerDateModel的字段控制
首先,SpinnerDateModel的setCalendarField方法决定了默认增减的时间字段。但要支持时分两个字段的编辑,我们需要根据用户当前编辑的位置动态切换这个字段:
SpinnerDateModel timeModel = new SpinnerDateModel(); // 默认按分钟增减,后续根据光标位置切换 timeModel.setCalendarField(Calendar.MINUTE);
2. 自定义时分编辑器
我们需要扩展JSpinner.DateEditor,做两件关键事情:
- 强制编辑器使用
HH:mm格式展示时间 - 根据光标位置切换模型的
calendarField,让上下按钮/键盘事件知道该增减小时还是分钟
class TimeOnlySpinnerEditor extends JSpinner.DateEditor { private final SpinnerDateModel model; public TimeOnlySpinnerEditor(JSpinner spinner) { super(spinner, "HH:mm"); this.model = (SpinnerDateModel) spinner.getModel(); JFormattedTextField textField = getTextField(); // 光标聚焦时自动选中当前编辑的时分段,并切换对应字段 textField.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { SwingUtilities.invokeLater(() -> { int caretPos = textField.getCaretPosition(); if (caretPos <= 2) { // 光标在小时段(HH:mm的前两位) model.setCalendarField(Calendar.HOUR_OF_DAY); textField.setSelectionStart(0); textField.setSelectionEnd(2); } else { // 光标在分钟段 model.setCalendarField(Calendar.MINUTE); textField.setSelectionStart(3); textField.setSelectionEnd(5); } }); } }); // 处理键盘上下键的增减逻辑 textField.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { spinner.setValue(model.getNextValue()); e.consume(); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { spinner.setValue(model.getPreviousValue()); e.consume(); } } }); } }
3. 绑定编辑器到JSpinner
最后把自定义编辑器设置给你的JSpinner即可:
JSpinner timeSpinner = new JSpinner(timeModel); timeSpinner.setEditor(new TimeOnlySpinnerEditor(timeSpinner));
为什么这个方案有效?
默认的精简编辑器(仅指定HH:mm格式)不会自动处理光标位置与Calendar字段的绑定,导致上下按钮不知道该触发哪个字段的增减,所以getNext/PreviousValue不会被调用。而我们的自定义编辑器通过监听光标位置动态切换模型的calendarField,让模型明确知道要对小时或分钟进行增减操作,同时处理了键盘上下键的事件,确保编辑行为符合预期。
内容的提问来源于stack exchange,提问作者Nefarious
相关产品推荐
相关产品推荐

