java - 用于 Composite 的所有控件的 FocusListener

标签 java focus swt

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

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


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

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

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

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


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

确保仅在观察到的组合处于 Activity 状态时添加监听器。处理复合 Material 时,请取下过滤器。

display.removeFilter( SWT.FocusIn, listener );

关于java - 用于 Composite 的所有控件的 FocusListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41590506/

相关文章:

java - 类文件未被读取

android - 在 Oreo 设备的聚焦 View 上禁用自动突出显示

java - 如何从组中删除标签占用的默认空间?

java - 需要 SWT 通知动画框(又名 toastr )

linux - Linux 上的 swt GUI 性能问题

java - 如何避免使用instanceof/这里如何使用多态

java - Java中删除数组中的一些项并收缩数组

java - 如何拆分/解析 Java 字符串以清晰地显示项目符号点?

html - 在 Dart 中处理丢失的焦点

android - Edittext 在键盘向上和滚动 ListView 时保持焦点