Java 检测应用程序是否获得焦点(与窗口焦点相反)

Java 检测应用程序是否获得焦点(与窗口焦点相反),java,swing,Java,Swing,我有一个程序,应该发出一些行动,当它被激活后,失去重点,以其他一些应用程序之前。我写了一个聚焦监听器来实现这一点: frame.addWindowFocusListener(new WindowFocusListener() { @Override public void windowGainedFocus(WindowEvent e) { <do something when we gain focus>

我有一个程序,应该发出一些行动,当它被激活后,失去重点,以其他一些应用程序之前。我写了一个聚焦监听器来实现这一点:

    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>
        }
    });
frame.addWindowFocusListener(新的WindowFocusListener(){
@凌驾
公共无效windowGainedFocus(WindowEvent e){
}
@凌驾
公共无效windowLostFocus(WindowEvent e){
}
});

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

谢谢@Aelop帮我找到答案。e、 GetObjectiveWindow()对于其他应用程序的窗口为空,因此我可以清楚地区分我来自何处:

    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>
        }
    });
frame.addWindowFocusListener(新的WindowFocusListener(){
@凌驾
公共无效windowGainedFocus(WindowEvent e){
如果(如getOppositeWindow()==null){
}
}
@凌驾
公共无效windowLostFocus(WindowEvent e){
}
});

谢谢@Aelop帮我找到答案。e、 GetObjectiveWindow()对于其他应用程序的窗口为空,因此我可以清楚地区分我来自何处:

    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>
        }
    });
frame.addWindowFocusListener(新的WindowFocusListener(){
@凌驾
公共无效windowGainedFocus(WindowEvent e){
如果(如getOppositeWindow()==null){
}
}
@凌驾
公共无效windowLostFocus(WindowEvent e){
}
});

如果您没有找到一个好的解决方案,那么在应用程序中的某个对话框失去焦点时,请使用静态变量将静态布尔变量设置为true。因此,当获得焦点且变量为true时,表示焦点来自应用程序中的某个窗口,而焦点则来自其他地方。如果您愿意,请尝试一下未找到某个应用程序或检查失去焦点的源的类型

如果未找到好的解决方案,请在应用程序中的对话框失去焦点时使用静态变量将静态布尔变量设置为true,因此当获得焦点且变量为true时,表示焦点来自应用程序中的某个窗口否则焦点来自其他地方我希望你能理解如果你没有找到某个应用程序或检查失去焦点的源的类型,请尝试更多…“我有一个程序,应该发布一些操作…”什么(具体)?请参见“重新加载数据”DYM“更新/刷新数据”,因为如果不是,您实际上是指“重新加载数据”,那么更好的策略是首先不要丢失数据。“这有关系吗?”如果你对应用程序的最佳实现方式有着完全错误的理解,那么你可能会问。此请求具有“异味”。如果上一个窗口是该对话框OK,请使用此
e.getOppositeWindow()==您想要忽略的对话框
忽略获得的焦点事件。。但是假设我有一个应用程序。显示仅占屏幕1/3的股票价格。我可能会在屏幕另一部分的文字处理程序中处理另一个文档时打开它。文字处理程序有焦点,但我仍然希望股票价格程序得到更新。我不能确定你的用户会不会想要这个应用。在这种情况下刷新数据,但他们可能更希望在最小化或明确命令数据“暂停”的情况下,它只“停留”在更新数据上。有关更多信息,请访问…“我有一个程序,应该发布一些操作…”什么(具体)?请参见“重新加载数据”DYM“更新/刷新数据”,因为如果不是,您实际上是指“重新加载数据”,那么更好的策略是首先不要丢失数据。“这有关系吗?”如果你对应用程序的最佳实现方式有着完全错误的理解,那么你可能会问。此请求具有“异味”。如果上一个窗口是该对话框OK,请使用此
e.getOppositeWindow()==您想要忽略的对话框
忽略获得的焦点事件。。但是假设我有一个应用程序。显示仅占屏幕1/3的股票价格。我可能会在屏幕另一部分的文字处理程序中处理另一个文档时打开它。文字处理程序有焦点,但我仍然希望股票价格程序得到更新。我不能确定你的用户会不会想要这个应用。在这种情况下刷新数据,但他们可能更喜欢在最小化数据或明确命令数据“暂停”时只“暂停”更新数据。