java - 在 SWT 中获取 Active Shell,即使 Shell 不在焦点上

标签 java windows swt

Display.getActiveShell() 似乎只有在获得焦点时才会将 Shell 视为 Activity 的。如果此时另一个应用程序获得焦点,则意味着 Display.getActiveShell() 返回 null

我需要一种方法,即使我的 SWT 应用程序不在焦点上,它也能始终告诉我哪个 Shell 焦点在我的 SWT 应用程序上。

我很快将这段代码整合在一起,虽然有时我会得到一个AssertionException:

public static Shell getActiveShell() {
    Display display = Display.getDefault();
    Shell result = display.getActiveShell();

    if (result == null) {
        Shell[] shells = display.getShells();
        for (Shell shell : shells) {
            if (shell.getShells().length == 0) {
                if (result != null)
                    throw new AssertionException();
                result = shell;
            }
        }
    }

    return result;
}

除了编写您自己的方法之外,是否有解决此问题的标准方法?

最佳答案

最近,我遇到了类似的问题,虽然您可能同时找到了解决方案,但我想分享我的以供将来引用。

ShellActivationTracker 添加了一个显示过滤器,用于监听 Activate 事件,并且 - 如果激活的小部件是 Shell - 记住最近激活的外壳。因此,即使您的应用程序当前未处于 Activity/焦点状态,您也可以查询(最后一个) Activity shell。

class ShellActivationTracker implements Listener {
  Shell activeShell;

  ShellActivationTracker(Display display) {
    activeShell = display.getActiveShell();
    display.addFilter(SWT.Activate, this);
  }

  @Override
  public void handleEvent(Event event) {
    if (event.widget instanceof Shell) {
      activeShell = (Shell)event.widget;
    }
  }
}

关于java - 在 SWT 中获取 Active Shell,即使 Shell 不在焦点上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542066/

相关文章:

java - 自动选择 SWT 文本框供用户输入信息

java - Java 中是否有一个可以读取数学函数的包(就像计算器一样)?

windows - OpenSSL 和读取 openssl.conf 文件时出错

windows - Rexx - 方括号用法

windows - Wix 通过 INSTALLUILEVEL_FULL 模式捕获 Windows Installer 错误消息

java - JFace对话框按钮翻译

java - 如何设置文本末尾的插入符号位置?

java - Android Studio仅支持一个settings.gradle吗?

java - 如何使用 android (PHP) 连接 MySQL 数据库?

java - 将参数从流重复应用到流畅的构建器方法