【问题标题】:Detect if application gains focus (as opposed to window focus)检测应用程序是否获得焦点(而不是窗口焦点)
【发布时间】:2016-12-13 13:12:23
【问题描述】:

我有一个程序应该在之前失去对其他应用程序的关注后被激活时发出一些动作。我写了一个 Focus-Listener 来实现这一点:

    frame.addWindowFocusListener(new WindowFocusListener() {
        @Override
        public void windowGainedFocus(WindowEvent e) {
          <do something when we gain focus>
        }

        @Override
        public void windowLostFocus(WindowEvent e) {
          <do something else when we lose focus>
        }
    });

问题是,当模式对话框(例如身份验证对话框)关闭时也会调用 gain-focus-action - 主窗口再次获得焦点。所以我需要以某种方式检测我是从我的程序内部还是从外部获得焦点。或者,换句话说,焦点操作不应该位于主窗口上,而应该位于应用程序本身上。有什么简单的方法可以做到这一点?

【问题讨论】:

  • see my question about了解更多...
  • “我有一个程序应该发出一些动作..” 什么(特别)?见What is the XY problem?
  • By "reload data" DYM "update / refresh data" 因为如果不是,你的意思实际上是 "reload data" 那么更好的策略是首先不要丢失数据。 “这有关系吗?” 如果您对实现应用程序的最佳方式有完全错误的理解,这可能。这个请求有那种“难闻的气味”。
  • 使用这个e.getOppositeWindow()==theDialogYouWantToIgnore 如果前一个窗口是那个对话框,则忽略焦点获得事件
  • 好的..但是。假设我有一个应用程序。显示仅占屏幕 1/3 的股票价格。在屏幕另一部分的文字处理程序中处理另一个文档时,我可能会打开它。文字处理程序有重点,但我仍然希望股票价格程序能够更新。我不能肯定地说您的用户会或不会想要该应用程序。在这种情况下刷新数据,但他们可能更喜欢它仅在最小化或明确命令它“暂停”时“休息”更新数据。

标签: java swing


【解决方案1】:

感谢@Aelop 帮助我找到答案。 e.getOppositeWindow() 对于其他应用程序的窗口为空,所以我可以清楚地区分我来自哪里:

    frame.addWindowFocusListener(new WindowFocusListener() {
        @Override
        public void windowGainedFocus(WindowEvent e) {
            if (e.getOppositeWindow()==null) {
                <do something when we gain focus>
            }
        }

        @Override
        public void windowLostFocus(WindowEvent e) {
          <do something else when we lose focus>
        }
    });

【讨论】:

    【解决方案2】:

    如果您没有找到好的解决方案,请在应用程序中的对话框中失去焦点时使用静态变量,将静态布尔变量设置为 true,这样当获得焦点且变量为 true 时,表示焦点来自应用程序中的某个窗口,否则焦点来自其他地方我希望你能得到这个想法,如果你没有找到某个应用程序或检查失去焦点的源的类型,请尝试它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2020-10-18
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多