我想在页面切换时在表单页面中缓存状态。
所以:我有3页表格,我希望当我从一个表格切换到另一个表格时数据保留在表格中。
我发现了这个:https://wiki.eclipse.org/Scout/Concepts/Page_Detail_Form
@Override
protected void execPageActivated() throws ProcessingException {
if (getDetailForm() == null) {
PersonDetailForm form = new PersonDetailForm();
form.setPersonNr(getPersonNr());
setDetailForm(form);
form.startView();
}
}
并说setDetailForm()缓存数据
As already said, attaching a detail form to a page means the detail form will automatically be
hidden when the page gets deactivated and shown when the page gets activated (see
PageDetailFormChanged on Desktop). So the detail form actually gets cached and does not need to
be started more than once per page. This requires that the form does not get closed.
但这不适合我。
我的代码是
@Override
protected void execPageActivated() throws ProcessingException {
// / Create and open form
if (getDetailForm() == null) {
MarginCalculationForm form = new MarginCalculationForm();
form.startModify();
setDetailForm(form);
}
super.execPageActivated();
}
但它保留在最后一页。
例如:
如果我有页面A,B,C和我打开页面A,则自行创建并将其设置为detailForm()。如果我然后打开页面B也可以。但是,如果我再次单击页面A,它会检查detailForm()是否为空(并且不是),因此它保留在页面B上(继续在页面A上进行)
编辑:
我认为getDetailForm()正在返回正确的表单,但显然super.execPageActivated()不起作用。
答案 0 :(得分:0)
我发现了什么问题。
问题出在Scout的DefaultPageChangeStrategy
课程中。方法pageChanged()
是这样的:
@Override
public void pageChanged(IOutline outline, IPage deselectedPage, IPage selectedPage) {
if (outline == null) {
return;
}
outline.clearContextPage();
IForm detailForm = null;
ITable detailTable = null;
ISearchForm searchForm = null;
// new active page
outline.makeActivePageToContextPage();
IPage activePage = outline.getActivePage();
if (activePage != null) {
try {
activePage.ensureChildrenLoaded();
}
catch (ProcessingException e1) {
SERVICES.getService(IExceptionHandlerService.class).handleException(e1);
}
if (activePage instanceof IPageWithTable) {
IPageWithTable tablePage = (IPageWithTable) activePage;
detailForm = activePage.getDetailForm();
if (activePage.isTableVisible()) {
detailTable = tablePage.getTable();
}
if (tablePage.isSearchActive()) {
searchForm = tablePage.getSearchFormInternal();
}
}
else if (activePage instanceof IPageWithNodes) {
IPageWithNodes nodePage = (IPageWithNodes) activePage;
detailForm = activePage.getDetailForm();
if (activePage.isTableVisible()) {
detailTable = nodePage.getInternalTable();
}
}
}
// remove first
if (detailForm == null) {
outline.setDetailForm(null);
}
if (detailTable == null) {
outline.setDetailTable(null);
}
if (searchForm == null) {
outline.setSearchForm(null);
}
// add new
if (detailForm != null) {
outline.setDetailForm(detailForm);
}
if (detailTable != null) {
outline.setDetailTable(detailTable);
}
if (searchForm != null) {
outline.setSearchForm(searchForm);
}
}
}
如果它是activePage
一个AbstractPage(而不是AbstractPageWithTable
AbstractPageWithNode
),detailForm
始终是null
并且这种中断行为。
因此,解决方案是使用AbstractPageWithNode更改AbstractPage并添加行
setTableVisible(false);
需要此行,因为如果不是第一次启动页面将不会显示。 (nodePage.getInternalTable()不为null,但它是空的,所以:
if (detailTable != null) {
outline.setDetailTable(detailTable);
}
将显示空白页面。)