我为包含多个控件(Composite
s,StyledText
等)的Button
编写了代码。
我想为整个FocusListener
实现Composite
(不仅仅是其中一个控件),但FocusListener没有做任何事情。
我尝试自己实现它,我的尝试是:向复合内的每个Control添加FocusListener
并处理这些事件。
在尝试这样做时,我发现了一些问题:
FocusLost
事件将在FocusGained
注意:我尝试在Display.getFocusControl()
方法中使用focusLost(...)
,但它只返回从中获取焦点的控件!
我的问题:在focusLost(...)
方法中,是否有可能找出下一个控件会获得焦点?
如果没有:是否有其他方法可以为FocusListener
实施Composite
?
答案 0 :(得分:2)
在发送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 );
确保仅在观察到的复合体处于活动状态时添加侦听器。处理复合材料时取下过滤器。
display.removeFilter( SWT.FocusIn, listener );
答案 1 :(得分:0)
@RüdigerHermanns工作得很好,但为了完整起见,我也会在这里发布我的解决方案:
我在我的合成中为SWT.Activate
和SWT.Deactivate
撰写了听众:
public MyComposite(Composite parent, int style)
{
super(parent, style);
createGuiElements(this);
this.addListener(SWT.Deactivate, new Listener()
{
@Override
public void handleEvent(Event event)
{
for (FocusListener listener : focusListeners) listener.focusLost(new FocusEvent(event));
}
});
this.addListener(SWT.Activate, new Listener()
{
@Override
public void handleEvent(Event event)
{
for (FocusListener listener : focusListeners) listener.focusGained(new FocusEvent(event));
}
});
}
通知Composite
上的所有focusListeners。