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
相关产品推荐
相关产品推荐

