在我的面板中,我将listView添加到具有可拆卸模型的表中:
修改
public class TaskDetailsPanel extends Panel {
...
public TaskDetailsPanel(String id, CompoundPropertyModel<LongRunningTask> model) {
super(id, model);
Task task = (LongRunningTask) getDefaultModelObject();
List<Timeframe> testList = task.getTimeframes();
DetachableTimeframeModel dtm = new DetachableTimeframeModel(new Model<Task>(task));
ListView frames = new ListView("frame", dtm) {
@Override
protected void populateItem(ListItem item) {
Timeframe tf = (Timeframe) item.getModelObject();
item.add(new Label("time", "von - bis"));
item.add(new Label("sentFiles", String.valueOf(tf.getSentFiles())));
item.add(new Label("receivedFiles", String.valueOf(tf.getReceivedFiles())));
item.add(new Label("missingMsgIds", String.valueOf(tf.getMissingMsgIds())));
item.add(new Label("receivedMsgIds", String.valueOf(tf.getReceivedMsgIds())));
}
};
frames.setOutputMarkupId(true);
add(frames);
...
}
}
这是我自定义的详细模型:
class DetachableTimeframeModel extends LoadableDetachableModel {
LongRunningTask task;
public DetachableTimeframeModel(LongRunningTask t) {
task = t;
}
@Override
protected List<Timeframe> load() {
return task.getTimeframes();
}
}
当我在面板中定义新列表List(例如ArrayList)并向其添加项目时,它就可以工作了。但是当列表来自另一个javabean时,它就会失败。
我错过了什么?
答案 0 :(得分:2)
将包含longRunningTask的模型传递给DetachableTimeframeModel。
在Wicket中,你永远不应该从模型中拉出一些东西,只是为了把它放到另一个模型中:
class DetachableTimeframeModel extends LoadableDetachableModel {
IModel<LongRunningTask> task;
public DetachableTimeframeModel(IModel<LongRunningTask> t) {
task = t;
}
@Override
protected List<Timeframe> load() {
return task.getObject().getTimeframes();
}
public void detach() {
super.detach(),
task.detach();
}
}
请注意,传递给TaskDetailsPanel的构造函数的模型应该能够从某个地方加载实际任务,而不仅仅是持有对它的引用。 Wicket组件和模型被序列化到会话/页面存储。