Eclipse scout缓存表单页面

时间:2014-11-14 08:29:04

标签: forms eclipse-scout

我想在页面切换时在表单页面中缓存状态。

所以:我有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()不起作用。

1 个答案:

答案 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);
  }

将显示空白页面。)