FocusListener用于Composite的所有控件

时间:2017-01-11 12:05:11

标签: java focus swt

我为包含多个控件(Composite s,StyledText等)的Button编写了代码。

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

我尝试自己实现它,我的尝试是:向复合内的每个Control添加FocusListener并处理这些事件。

在尝试这样做时,我发现了一些问题:

  • 当两个控件具有FocusListener并且我将焦点从一个更改为另一个时,FocusLost事件将在FocusGained
  • 之前触发
  • 因此,我无法确定是否将焦点放在我的复合材料中的其他控件之一,或者复合材料是否完全失去焦点。

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

我的问题:在focusLost(...)方法中,是否有可能找出下一个控件会获得焦点?

如果没有:是否有其他方法可以为FocusListener实施Composite

2 个答案:

答案 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.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。