Composite 的所有控件的 FocusListener
FocusListener for all controls of a Composite
我已经为包含多个控件(StyledText
s、Button
s 等)的 Composite
编写了代码。
我想为整个 Composite
实现一个 FocusListener
(不仅仅是其中的一个控件),但是 FocusListener 没有做任何事情。
我尝试自己实现,我的尝试是:在复合体中的每个控件中添加一个FocusListener
并处理这些事件。
在尝试这样做的过程中,我发现了一些问题:
- 当两个控件都有 FocusListener 并且我将焦点从一个更改为另一个时,
FocusLost
事件在 FocusGained
之前触发
- 因此,我无法确定焦点是否给予了合成中的其他控件之一,或者合成是否完全失去了焦点。
注意:我尝试在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.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。
我已经为包含多个控件(StyledText
s、Button
s 等)的 Composite
编写了代码。
我想为整个 Composite
实现一个 FocusListener
(不仅仅是其中的一个控件),但是 FocusListener 没有做任何事情。
我尝试自己实现,我的尝试是:在复合体中的每个控件中添加一个FocusListener
并处理这些事件。
在尝试这样做的过程中,我发现了一些问题:
- 当两个控件都有 FocusListener 并且我将焦点从一个更改为另一个时,
FocusLost
事件在FocusGained
之前触发
- 因此,我无法确定焦点是否给予了合成中的其他控件之一,或者合成是否完全失去了焦点。
注意:我尝试在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.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。