【问题标题】:JavaFX - Check if Application is on foregroundJavaFX - 检查应用程序是否在前台
【发布时间】:2016-09-21 20:07:00
【问题描述】:

我实际上正在开发一个聊天应用程序。 如果用户收到一条新消息,我会向他的桌面发送通知,即使他的程序在前台。这很烦人。 所以我想知道如何检查应用程序是否在前景/聚焦/显示(无论如何)。 我已经用谷歌搜索了,但没有找到可行的方法。

【问题讨论】:

  • 我不知道有什么强大的 Java 机制可以解决这个问题。我认为您需要使用操作系统级别的库(IE:Windows Library)。
  • @Ironcache 我正在使用 Java,我不能使用 Windows 库对吗?无论如何,Java 程序应该是跨平台的,而不是特定于 Windows 的(我的是):)
  • 首先,不,Java 程序可以与本机库交互。看看JNA。对于你的第二点,我能说什么?该功能在 Java AFAIK 中无法以稳健的方式使用。如果你想要一个跨平台的应用程序,你需要使用你目标平台的本地库,或者接受这个作为一个缺点。你可以在Window 类中尝试isFocused()isShowing(),但我认为它不会令人满意。
  • @Ironcache 我的同事刚刚用一个空白应用程序尝试了它,它适用于focusedProperty,但我的应用程序却没有。 focusProperty 上的更改侦听器甚至没有被调用,并且 isFocused 也永久返回 false
  • 是的,焦点是变化无常的,根据我的经验,在 Java 中 具有焦点的上下文之外依赖它通常是可疑的。在 Java 之外,Java 的焦点机制不能很好地工作。也就是说,试图让你的同事的结果与你的相同,我有几个问题:1)他如何最小化与你如何最小化。按最小化与选择不同的窗口(在当前 JVM 之外)与 Java 的观点不同。 2)他和你在什么操作系统上运行?你能在你的机器上重现他的空白应用程序的结果吗?

标签: java javafx focus visible stage


【解决方案1】:

我知道这有点晚了,但我希望它可以帮助某人

primaryStage.focusedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            if(!newValue) {
                // if windows doesn't focused
                // do action
            }
        }
});

要直接验证窗口是否获得焦点,请执行此操作

if(!primaryStage.isFocused()) {
    // if windows doesn't focused
    // do action
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多