如何将gwt组合小部件更改事件分组为一个更改事件
如果我有一个GWT复合小部件,它有三个文本框,比如SSN,并且我只需要在小部件整体(而不是单个文本框)的焦点丢失时触发更改事件,那么如何执行此操作?您需要在复合上实现观察者模式,并每次触发新通知:如何将gwt组合小部件更改事件分组为一个更改事件,gwt,Gwt,如果我有一个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();
}
};
}
};