Java 如何侦听编辑器<;上的小部件触发的ValueChangedEvents&燃气轮机;在GWT?

Java 如何侦听编辑器<;上的小部件触发的ValueChangedEvents&燃气轮机;在GWT?,java,events,gwt,Java,Events,Gwt,“我的编辑器”由几个文本框、复选框等组成。在编辑器本身上侦听由其小部件触发的ValueChangeEvents的正确方式是什么 我试图弄明白,但没有用。(G+帖子的扩展讨论) 您可以考虑以下几点: 安慰剂保存按钮不是一个糟糕的主意。在对话框中,“保存”通常意味着“保存并关闭”,这意味着它可能位于“取消并关闭”类型按钮旁边-如果未进行任何更改,效果将相同。只有代码需要知道在没有更改的情况下有差异。在文档中,“保存”只是一种刷新最近更改的方法,同样,按钮后面的代码可以忽略它。允许用户指示软件保存超

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

我试图弄明白,但没有用。

(G+帖子的扩展讨论)

您可以考虑以下几点:

  • 安慰剂保存按钮不是一个糟糕的主意。在对话框中,“保存”通常意味着“保存并关闭”,这意味着它可能位于“取消并关闭”类型按钮旁边-如果未进行任何更改,效果将相同。只有代码需要知道在没有更改的情况下有差异。在文档中,“保存”只是一种刷新最近更改的方法,同样,按钮后面的代码可以忽略它。允许用户指示软件保存超出需要的数据可能不是一件坏事,也就是说
  • 编辑器框架的构建允许访问者浏览驱动程序知道的编辑器树。这将使您能够构建一个访问者,该访问者可以询问树中的每个编辑器是否实现HasValueChangeHandlers,如果实现,则添加一个处理程序。但是
  • ValueChangeEvents在小部件逻辑上发生更改并具有新值时关闭。这些更改几乎总是在用户模糊出字段后发生-如果光标仍在用户修改的唯一文本框中,并且用户将光标悬停在“保存”按钮上,则光标仍将模糊,因为没有发生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!