2009-05-26 14 views
5

私はSSNのような3つのテキストボックスを持つGWTコンポジットウィジェットを持っていて、フォーカスがウィジェット全体から失われたときだけ変更イベントを発生させる必要があります個々のテキストボックスから、それをどうやって行うのですか?あなたの複合にObserverパターンを実装し、新しい通知毎回トリガする必要があるgwtコンポジットウィジェットのイベントを1つの変更イベントとしてグループ化する方法

答えて

0

:特定のテキストボックスと

  • にフォーカスが失われたフォーカスを

    • は、のいずれかに転送されませんでした他のテキストボックス。
  • +1

    をイベントの順序であるため保証なしで動作しないことフォーカスが失われ、フォーカスは別のボックスで得られました。 – retrobrain

    +0

    DeferredCommandを使用すると、次のようなトリックが発生する可能性があります。 http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/DeferredCommand.html – ivo

    +0

    明確化:1.イベントをキャッチテキストボックスの1つから失われたフォーカス2. DefferredCommandを使用して、他のテキストボックスでフォーカスが得られなかったかどうかを確認します。 3.他のテキストボックスにフォーカスが得られなかった場合、コンポジットは "フォーカスが失われた"(または何でも)通知を出します。 – ivo

    1

    ウィジェット全体がフォーカスを失ったとき(テキストボックスではない)にイベントを表示するには、ウィジェットのトップレベルをFocusPanelにして、それが与えるイベントを公開します。

    +1

    これは私が試した最初のことですが、何らかの理由でイベントが発生しません。 FocusPanelには、3つのテキストボックスを持つHorizo​​ntalPanelがあります。 – retrobrain

    0

    タイマーを使用できませんでしたか?テキストボックスからフォーカスが失われたら、ヒットしたときに3つのTextBoxインスタンスすべてにフォーカスを合わせる5ms(または何か小さい)タイマーを開始します。フォーカスがない場合は、手動でオブザーバーに通知します。フォーカスがある場合は何もしないでください。

    あなたコンポジットクラスでこれを置く:そして

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

    そして、あなたのTextBoxのインスタンスのそれぞれにこれを追加します。

    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(); 
         } 
        }; 
        } 
    }; 
    
    関連する問題