You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codename One中DatePicker触发SpinnerNode数组越界异常咨询

Codename One DatePicker ArrayIndexOutOfBoundsException 解决方法

问题场景

通过datePicker = new Picker();创建DatePicker组件后,在模拟器中选择新日期时触发ArrayIndexOutOfBoundsException,异常堆栈如下:

[EDT] 0:3:5,244 - Exception: java.lang.ArrayIndexOutOfBoundsException - Index out of bounds:13, must be between 0 and 13
java.lang.ArrayIndexOutOfBoundsException: Index out of bounds:13, must be between 0 and 13
    at com.codename1.ui.spinner.SpinnerNode.setSelectedIndex(SpinnerNode.java:210)
    at com.codename1.ui.spinner.SpinnerNode.rebuildChildren(SpinnerNode.java:149)
    at com.codename1.ui.spinner.SpinnerNode.setRowFormatter(SpinnerNode.java:124)
    at com.codename1.ui.spinner.Spinner3D.setRowFormatter(Spinner3D.java:351)
    at com.codename1.ui.spinner.DateSpinner3D.initSpinner(DateSpinner3D.java:116)
    at com.codename1.ui.spinner.DateSpinner3D.<init>(DateSpinner3D.java:90)
    at com.codename1.ui.spinner.Picker$1.createDatePicker3D(Picker.java:498)
    at com.codename1.ui.spinner.Picker$1.showInteractionDialog(Picker.java:623)
    at com.codename1.ui.spinner.Picker$1.actionPerformed(Picker.java:313)
    at com.codename1.ui.util.EventDispatcher.fireActionSync(EventDispatcher.java:459)
    at com.codename1.ui.util.EventDispatcher.fireActionEvent(EventDispatcher.java:362)
    at com.codename1.ui.Button.fireActionEvent(Button.java:687)
    at com.codename1.ui.Button.released(Button.java:728)
    at com.codename1.ui.Button.pointerReleased(Button.java:835)
    at com.codename1.ui.LeadUtil.pointerReleased(LeadUtil.java:153)
    at com.codename1.ui.Form.pointerReleased(Form.java:3881)
    at com.codename1.ui.Component.pointerReleased(Component.java:5265)
    at com.codename1.ui.Display.handleEvent(Display.java:2409)
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1285)
    at com.codename1.ui.Display.mainEDTLoop(Display.java:1203)
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)

解决方法

  • 明确设置日期范围与类型
    初始化Picker时指定日期类型,并限制可选的最小/最大日期,避免Spinner节点处理超出边界的索引:

    datePicker = new Picker();
    // 指定为日期选择类型
    datePicker.setType(Display.PICKER_TYPE_DATE);
    
    // 设置最小日期为当前年1月1日
    Calendar minCalendar = Calendar.getInstance();
    minCalendar.set(Calendar.MONTH, Calendar.JANUARY);
    minCalendar.set(Calendar.DAY_OF_MONTH, 1);
    datePicker.setMinDate(minCalendar.getTime());
    
    // 设置最大日期为当前年12月31日
    Calendar maxCalendar = Calendar.getInstance();
    maxCalendar.set(Calendar.MONTH, Calendar.DECEMBER);
    maxCalendar.set(Calendar.DAY_OF_MONTH, 31);
    datePicker.setMaxDate(maxCalendar.getTime());
    
  • 升级Codename One SDK到最新稳定版
    该异常大概率是旧版本SDK中的已知bug,升级到最新版本可修复底层Spinner组件的索引处理问题。

  • 自定义日期选择界面
    若默认Picker组件问题无法解决,可自行构建日期选择Dialog,绕过默认的Spinner3D实现:

    Button selectDateBtn = new Button("选择日期");
    selectDateBtn.addActionListener(e -> {
        Dialog dateDialog = new Dialog("选择日期");
        // 添加年、月、日选择组件(如Spinner或ComboBox)
        // 实现自定义日期选择逻辑
        dateDialog.show();
    });
    
  • 检查并设置标准Locale
    部分Locale下月份索引的处理可能存在异常,尝试显式设置标准Locale:

    Locale.setDefault(Locale.US);
    

内容的提问来源于stack exchange,提问作者stylsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:45:31