如何在GWT中的编辑器<! - ? - >上侦听由小部件触发的ValueChangedEvents?

时间:2013-05-05 14:54:12

标签: java events gwt

我的编辑器由几个TextBox,CheckBoxes等组成。对于由其小部件触发的ValueChangeEvents,在编辑器本身上监听的正确方法是什么?

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

1 个答案:

答案 0 :(得分: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!