我尝试创建以下结构的页面:
MainPage {
DateSelector {}
TabGroup {
Tab0 {...}
Tab1 {...}
Tab2 {...}
}
}
DateSelector是一个组件(扩展面板),使用户可以选择时间范围(startDate、endDate)。扩展“ajaxtabbedpanel”的选项卡组。选项卡组中显示的选项卡应使用选定的时间跨度来显示内容。
因此,如果用户在选择器中选择时间跨度,则所选选项卡中的内容应更新。
为此,我实现了一个DateSelector的用户可以重写以更新其内容的方法。
我觉得我的方法违背了框架。我可以用某种方式利用一个模型来加强实施吗?这是怎么回事?这些选项卡是否可以与日期选择器共享时间跨度,以便在时间跨度发生更改时进行更新?没有回电话?
DateSelector的实现方式如下:
abstract public class TimespanSelectionPanel extends Panel {
public TimespanSelectionPanel(String id, Timespan timespan) {
super(id, new CompoundPropertyModel<Timespan>(timespan));
final DateTextField fromTextField = DateTextField.forDatePattern("from", "dd.MM.yyyy");
fromTextField.setOutputMarkupId(true);
fromTextField.add(new DatePicker());
final DateTextField toTextField = DateTextField.forDatePattern("to", "dd.MM.yyyy");
toTextField.setOutputMarkupId(true);
toTextField.add(new DatePicker());
fromTextField.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
});
toTextField.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
});
add(new AjaxLink<String>("today") {
@Override
public void onClick(AjaxRequestTarget target) {
updateComponent(fromTextField, toTextField, target, Timespan.today());
}
});
add(new AjaxLink<String>("yesterday") {
@Override
public void onClick(AjaxRequestTarget target) {
updateComponent(fromTextField, toTextField, target, Timespan.yesterday());
}
});
add(new AjaxLink<String>("lastMonth") {
@Override
public void onClick(AjaxRequestTarget target) {
updateComponent(fromTextField, toTextField, target, Timespan.lastMonth());
}
});
add(new AjaxLink<String>("actualMonth") {
@Override
public void onClick(AjaxRequestTarget target) {
Timespan timespan = adjustToTextField(fromTextField, toTextField, target, Timespan.actualMonth());
updateComponent(fromTextField, toTextField, target, timespan);
}
});
add(new AjaxLink<String>("fromTo") {
@Override
public void onClick(AjaxRequestTarget target) {
Timespan newTimespan = adjustToTextField(fromTextField, toTextField, target, fromTextField
.getModelObject(), toTextField.getModelObject());
update(target, newTimespan);
}
});
add(fromTextField);
add(toTextField);
}
private Timespan adjustToTextField(DateTextField fromTextField, DateTextField toTextField,
AjaxRequestTarget target, Timespan timespan) {
return adjustToTextField(fromTextField, toTextField, target, timespan.getFrom(), timespan.getTo());
}
private Timespan adjustToTextField(final DateTextField fromTextField, final DateTextField toTextField,
AjaxRequestTarget target, Date from, Date to) {
Date today = DateUtil.today();
if (to.after(today)) {
to = today;
toTextField.setModelObject(today);
target.addComponent(toTextField);
}
if (from.after(to)) {
from = to;
fromTextField.setModelObject(from);
target.addComponent(fromTextField);
}
return Timespan.fromTo(from, to);
}
private void updateComponent(final DateTextField fromTextField, final DateTextField toTextField,
AjaxRequestTarget target, Timespan newTimespan) {
fromTextField.setModelObject(newTimespan.getFrom());
toTextField.setModelObject(newTimespan.getTo());
target.addComponent(fromTextField);
target.addComponent(toTextField);
update(target, newTimespan);
}
abstract protected void update(AjaxRequestTarget target, Timespan timespan);
}