我为Composite编写了包含多个控件(StyledTexts、Buttons等)的代码。
我想为整个FocusListener实现一个Composite (不仅仅是其中的一个控件),但是FocusListener没有做任何事情。
我尝试自己实现它,我的尝试是:在复合内部的每个控件中添加一个FocusListener并处理这些事件。
在尝试这样做的时候,我发现了一些问题:
FocusLost事件将在FocusGained之前触发。注意:--我尝试在focusLost(...)方法中使用Display.getFocusControl(),但它只返回焦点所在的控件!
我的问题:在focusLost(...)方法中,是否有可能找出接下来哪个控件将接收焦点?
如果没有:是否有其他方法为FocusListener实现Composite
发布于 2017-01-11 13:08:00
在发送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 );发布于 2017-01-16 13:44:22
@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));
}
});
}通知所有的focusListeners在Composite上。
https://stackoverflow.com/questions/41590506
复制相似问题