我已经为包含多个控件(StyledText
、Button
等)的 Composite
编写了代码。
我想为整个Composite
(不仅仅是其中的一个控件)实现一个FocusListener
,但是FocusListener没有做任何事情。
我尝试自己实现它,我的尝试是:向组合内的每个 Control 添加一个 FocusListener
并处理这些事件。
在尝试这样做时,我发现了一些问题:
- 当两个控件具有 FocusListener 并且我将焦点从一个控件更改为另一个控件时,
FocusLost
事件会在FocusGained
之前触发 - 因此,我无法确定焦点是否已分配给复合 Material 中的其他控件之一,或者复合 Material 是否完全失去了焦点。
注意:我尝试在 focusLost(...)
方法中使用 Display.getFocusControl()
,但它只返回控件从中获取焦点!
我的问题:是否有可能在 focusLost(...)
方法内部找出哪个控件接下来将获得焦点?
如果没有:是否有其他方法可以为Composite
实现FocusListener
?
最佳答案
发送 focusLost()
事件时,尚不知道哪个控件(如果有)将接收焦点。
您可以添加一个显示过滤器,只要整个应用程序中的控件获得焦点,它就会通知您。在“Listener”实现中,只要控件获得未包含在组合中的焦点,您就可以保存文本输入。例如:
Listener listener = new Listener() {
@Override
public void handleEvent( Event event ) {
if( event.widget != text || event.widget != fontButton || ... ) {
save();
}
}
};
display.addFilter( SWT.FocusIn, listener );
确保仅在观察到的组合处于 Activity 状态时添加监听器。处理复合 Material 时,请取下过滤器。
display.removeFilter( SWT.FocusIn, listener );
关于java - 用于 Composite 的所有控件的 FocusListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41590506/