我正在定制GWT 2.5.1的DateBox。
我的要求是:我不能允许日期超过9999年12月31日,我需要严格的日期解析,始终(也就是说,我只需要允许DD/MM/YYYY格式的日期,这是我的MyDatePickerFormat格式使用的格式),我需要检索解析错误并将错误传播到编辑器框架(并将其显示在我的自定义Widget的某个位置,该Widget实现了HasEditorErrors)。
这是我为此目的创建的类的列表:
1. MyDateBox extends DateBox implements ParseEvent.HasParseEventHandlers.
2. MyDatePickerFormat implements Format
3. MyDateBoxEditorDecorator extends Composite implements HasEditorErrors<Date>, HasEnabled, HasValue<Date>,
IsEditor<LeafValueEditor<Date>>, HasEditorDelegate<Date>
详细信息:
1.
public MyDateBox()
{
super();
this.getTextBox().setMaxLength(MyDateBox.MyDatePickerFormat.MAX_DATE_LENGTH);
final MyDatePickerFormat myPickerFormat = new MyDateBox.MyDatePickerFormat();
setFormat(myPickerFormat);
ParseEventHandler handler = new ParseEventHandler()
{
@Override
public void onParseEvent(ParseEvent event)
{
MyDateBox.this.fireEvent(event);
}
};
myPickerFormat.setParseEventHandler(handler);
}
Instanciates 1 MyDateBox对象。使用ParseEventHandler来传播解析问题
覆盖com.google.gwt.user.datepicker.client.DateBox.Format.parse(DateBox,字符串,布尔值)以始终调用com.google.gwt.i18n.shared.DateTimeFormat.parseStrict(String),并对解析日期最多为9999年1月1日
在解析方法结束时,它将实例化一个ParseEvent并调用"父"ParseEventHandler处理程序方法。
3.
public MyDateBoxEditorDecorator()
{
dateBox = new MyDateBox();
dateBox.addParseErrorHandler(new ParseEventHandler()
{
@Override
public void onParseEvent(ParseEvent event)
{
MyDateBoxEditorDecorator.this.onParseEvent(event);
}
});
initWidget(Binder.BINDER.createAndBindUi(this));
contents.add(dateBox);
}
我的问题如下:
- 事件处理在我看来相当笨拙(事件已安装并使用一个处理程序进行处理,然后在封闭小部件级别(让我们将该小部件称为"w")由使用其"addParseHandler"添加到w的处理程序方法最后一个处理程序在MyDateBoxEditorDecorator实例。这有很多步骤,我想一定有更好的方法来处理这个问题?(我把它搞得太复杂了?)
- MyDateBoxEditorDecorator错误处理与我的编辑器层次结构集成不好。发生的情况是,当用户修改日期字段内容(重复…),多次解析事件最终发布。我的MyDateBoxEditorDecorator实例(我们称之为"myDateBoxEditor")最终调用其代理的recordError()多次。然后,当我最终调用flush()刷新我的整个编辑器层次结构,myDateBoxEditorshowError(List errors)方法获取的错误太多input(我认为自上次调用flush()以来的所有错误)。我能做什么如何避免这种情况?(会在我的MyDateBoxEditorDecorator实例并刷新它-每次解析完成-是解决这个问题的正确方法吗?)
谢谢。
PS。我对SO格式不太了解,我已经尽力了(它看起来很难看,但可读性足够)。
提醒一下:我已经解决了最大的问题(我的编辑器层次结构与错误处理有关的问题)。原因是我在一个编辑器周期内多次调用getValue()(例如,每次用户修改字段时),这就是导致显示重复错误的原因——根据Valueboxeditordecorator源代码,其中一个错误应该是而不是。至于其他问题,我希望有优雅的解决方案,但我认为这可以