如何将gwt复合小部件更改为一个更改事件
答
您需要实现您的复合Observer模式,并触发新的通知,每次:
- 重点是在一个特定的文本框丢失,
- 焦点未转移到任何的其他文本框。
答
如果您只想在整个窗口小部件失去焦点(而不是文本框)的情况下执行事件,那么将窗口小部件的顶层设置为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();
}
};
}
};
不会因为事件的顺序没有保证的工作焦点丢失,焦点在不同的盒子上获得。 – retrobrain 2009-05-26 22:26:55
使用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