Composite 的所有控件的 FocusListener

FocusListener for all controls of a Composite

我已经为包含多个控件(StyledTexts、Buttons 等)的 Composite 编写了代码。

我想为整个 Composite 实现一个 FocusListener(不仅仅是其中的一个控件),但是 FocusListener 没有做任何事情。


我尝试自己实现,我的尝试是:在复合体中的每个控件中添加一个FocusListener并处理这些事件。

在尝试这样做的过程中,我发现了一些问题:

注意:我尝试在focusLost(...)方法中使用Display.getFocusControl(),但它只returns获得焦点的控件!


我的问题:是否可以在 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 );

确保仅在观察到的组合处于活动状态时添加侦听器。处理复合材料时取下过滤器。

display.removeFilter( SWT.FocusIn, listener );

@RüdigerHermanns 工作得很好,但为了完整起见,我也会 post 我的解决方案在这里:

我已经在我的组合中为 SWT.ActivateSWT.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。