Как сгруппировать составные виджеты gwt, изменить события как одно событие изменения - PullRequest
5 голосов
/ 27 мая 2009

Если у меня есть составной виджет GWT с тремя текстовыми полями, как для SSN, и мне нужно запускать событие изменения только тогда, когда фокус теряется из виджета в целом, а не из отдельных текстовых полей, как это сделать?

Ответы [ 3 ]

1 голос
/ 27 мая 2009

Если вам нужно только событие, когда весь ваш виджет теряет фокус (а не текстовые поля), то сделайте верхний уровень вашего виджета фокусной панелью и выставьте события, которые он вам дает.

0 голосов
/ 30 мая 2009

Не могли бы вы использовать таймер? При потере фокуса из текстового поля запустите 5 мс (или что-то маленькое) таймер, который при попадании будет проверять фокус на всех 3 экземплярах TextBox. Если ни у кого нет фокуса, то вы вручную уведомляете своих наблюдателей. Если у тебя есть фокус, ничего не делай.

Поместите это в ваш класс Composite:

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();
      }
    };
  }
};
0 голосов
/ 27 мая 2009

Вам необходимо внедрить шаблон наблюдателя в свой композит и каждый раз запускать новое уведомление:

  • фокус теряется на определенном текстовом поле И
  • фокус не был перенесен ни на одно из других текстовых полей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...