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

问题描述:

如果我有一个包含三个文本框的SST复合小部件,例如SSN,并且只有当焦点从小部件整体中丢失时才需要触发更改事件,而不是从单个文本框中怎么去做呢?如何将gwt复合小部件更改为一个更改事件

您需要实现您的复合Observer模式,并触发新的通知,每次:

  • 重点是在一个特定的文本框丢失,
  • 焦点未转移到任何的其他文本框。
+1

不会因为事件的顺序没有保证的工作焦点丢失,焦点在不同的盒子上获得。 – retrobrain 2009-05-26 22:26:55

+0

使用DeferredCommand可能会诀窍: http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/DeferredCommand.html – ivo 2009-05-26 22:54:50

如果您只想在整个窗口小部件失去焦点(而不是文本框)的情况下执行事件,那么将窗口小部件的顶层设置为FocusPanel,并将它提供给您的事件公开。

难道你不能使用计时器吗?在文本框丢失焦点时,启动一个5ms(或小的)定时器,当它打到时,将检查所有3个TextBox实例的焦点。如果没有人关注,那么你手动通知你的观察员。如果有人专注,就不要做任何事情。

把这个在您的复合类:

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

然后添加到您的文本框实例的每一个:

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(); 
     } 
    }; 
    } 
};