2009-05-26 61 views

回答

0

您需要實現您的複合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

1

如果您只想在整個窗口小部件失去焦點(而不是文本框)的情況下執行事件,那麼將窗口小部件的頂層設置爲FocusPanel,並將它提供給您的事件公開。

0

難道你不能使用計時器嗎?在文本框丟失焦點時,啓動一個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(); 
     } 
    }; 
    } 
};