1

我的编辑器由几个文本框、复选框等组成。在编辑器本身上侦听由其小部件触发的 ValueChangeEvents 的正确方法是什么?

我试图理解Developer's Guide - Editors但无济于事。

4

1 回答 1

2

(来自 G+ 帖子的扩展讨论)

您可能会考虑一些想法:

  • 安慰剂保存按钮并不是一个糟糕的主意。在对话框中,“保存”通常意味着“保存并关闭”,这意味着它可能旁边有一个“取消和关闭”类型的按钮 - 如果没有进行任何更改,效果将是相同的。只有代码需要知道在没有变化的情况下有区别。在文档中,“保存”只是一种将任何最近更改刷新回来的方法,并且按钮后面的代码可以再次忽略它。允许用户指示软件保存不必要的东西可能不是一件坏事,也就是说......
  • 编辑器框架的构建允许访问者遍历驱动程序知道的编辑器树。这将使您能够构建一个访问者,该访问者可以询问树中的每个编辑器是否实现了 HasValueChangeHandlers,如果是,则添加一个处理程序。但...
  • 当小部件在逻辑上发生更改并具有新值时,ValueChangeEvents 就会发生。这些更改几乎总是仅在用户模糊出字段时才会发生 - 如果光标仍在用户修改的唯一 TextBox 中,并且用户将鼠标悬停在保存按钮上,它仍然会模糊,因为没有 ValueChangeEvent发生了。您需要等待他们离开该字段,或者轮询活动字段以查看它是否有新值,或者询问驱动程序是否脏。请注意,并非所有小部件都能很好地轮询 - 有些小部件在仍然聚焦时没有可用的值(例如任何 CellWidget),而其他小部件不理解 isDirty()(如 HasDataEditor)。

要查找的示例编辑器访问者HasValueChangeHandlers

driver.accept(new EditorVisitor(){
  @Override
  public <T> void endVisit(EditorContext<T> ctx) {
    Editor<T> ed = ctx.getEditor();
    if (ed instanceof HasValueChangeHandlers) {
      @SuppressWarnings("unchecked")
      HasValueChangeHandlers<T> hasHandlers = (HasValueChangeHandlers<T>) ed;
      hasHandlers.addValueChangeHandler(new ValueChangeHandler<T>() {
        @Override
        public void onValueChange(ValueChangeEvent<T> event) {
          // TODO update button
          // consider comparing event.getValue() with ctx.getFromModel()
          // though that requires seeing which editors have changes...
        }
      });
    }
  }
});

示例轮询更改:

Timer t = new Timer(){
  @Override
  public void run() {
    boolean hasChanges = driver.isDirty();
    // TODO update button with the hasChanges value
  }
};
t.schedule(500);
// Don't forget to cancel() this when done, both on save and cancel!
于 2013-05-06T02:39:27.373 回答