Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将gwt组合小部件更改事件分组为一个更改事件_Gwt - Fatal编程技术网

如何将gwt组合小部件更改事件分组为一个更改事件

如何将gwt组合小部件更改事件分组为一个更改事件,gwt,Gwt,如果我有一个GWT复合小部件,它有三个文本框,比如SSN,并且我只需要在小部件整体(而不是单个文本框)的焦点丢失时触发更改事件,那么如何执行此操作?您需要在复合上实现观察者模式,并每次触发新通知: 焦点在特定文本框上丢失,并且 焦点未转移到任何其他文本框 如果您只希望在整个小部件失去焦点时发生事件(而不是文本框),则将小部件的顶层设置为焦点面板,并公开它提供给您的事件。您不能使用计时器吗?当文本框失去焦点时,启动一个5毫秒(或一些小的)计时器,当它点击时,将检查所有3个文本框实例的焦点。如果没

如果我有一个GWT复合小部件,它有三个文本框,比如SSN,并且我只需要在小部件整体(而不是单个文本框)的焦点丢失时触发更改事件,那么如何执行此操作?

您需要在复合上实现观察者模式,并每次触发新通知:

  • 焦点在特定文本框上丢失,并且
  • 焦点未转移到任何其他文本框

如果您只希望在整个小部件失去焦点时发生事件(而不是文本框),则将小部件的顶层设置为焦点面板,并公开它提供给您的事件。

您不能使用计时器吗?当文本框失去焦点时,启动一个5毫秒(或一些小的)计时器,当它点击时,将检查所有3个文本框实例的焦点。如果没有焦点,则手动通知观察者。如果一个人有注意力,什么也不做

将其放在您的复合类中:

private Map<Widget, Boolean> m_hasFocus = new HashMap<Widget, Boolean>();

这是行不通的,因为无法保证在不同的框上失去焦点和获得焦点的事件的顺序。使用DeferredCommand可能会达到以下目的:澄清:1。从其中一个文本框捕获焦点丢失事件;2.使用DefferredCommand检查其他文本框是否未获得焦点;3.如果其他文本框没有获得焦点,那么您的组合将触发一个“焦点丢失”(或其他)通知,该通知将不再起作用,因为在deferred命令中,您无法确定focus-govered方法中的哪些文本框deferred命令将首先被调用。这是我尝试的第一件事,但出于某种原因,不会触发任何事件。FocusPanel拥有一个水平面板,其中有三个文本框。
new FocusListener() {
  public void onFocus(Widget sender) {
    m_hasFocus.put(sender, Boolean.TRUE);
  }

  public void onLostFocus(Widget sender) {
    m_hasFocus.put(sender, Boolean.FALSE);
    new Timer() {
      public void run() {
        for (Boolean bool : m_hasFocus.values()) {
          if (bool) { return; }
        }
        notifyObservers();
      }
    };
  }
};