如何应对从另一个应用程序获得焦点?

时间:2015-12-27 19:00:21

标签: java events focus javafx-8

我的JavaFX 8应用程序在集中注意力时必须doStuff()。这很简单:

primaryStage.focusedProperty().addListener((observable, wasFocused, nowFocused) -> {
    doStuff();
});

但是,当我显示一个对话框并且用户将其关闭时,doStuff()会触发。我希望它只在用户从另一个应用程序切换到我的应用程序时触发,例如来自浏览器的 Alt + Tab

换句话说,我希望doStuff()如果其他应用的窗口失去焦点,我的应用窗口就会聚焦。

有可能吗?

编辑: FibreFoXAppelemac发布的答案要求在显示对话框之前明确执行其他步骤。这个解决方案远非完美,因为我(或者任何开发人员)在显示对话之前必须记住这一步。忘记它会引入难以发现的错误。

扩展Dialog以自动执行此操作不是一种选择,因为我想使用已扩展原始Dialog的内置对话框。

这是非常基本的功能,如果在JavaFX中没有简单的方法可以实现这一点,我会感到惊讶。

2 个答案:

答案 0 :(得分:1)

我建议在Dialog中添加一个监听器,如果Dialog刚刚关闭/丢失焦点,则允许你不要doStuff()。

我能想到的最简单的方法是在对话框关闭时设置一个Instant(使用Instant.now),如果应用程序重新获得焦点,则创建另一个Instant,并检查Duration.between(instantLostFocusDialog, instantGainedFocusApp).getSeconds()是否超过1(或添加) getNano()更具体地说明了这一点。只有这样你才会doStuff()

答案 1 :(得分:1)

打开此类对话框时可以使用全局布尔值,并且只有当该全局开关为true / false /无论你选择什么时,你才可以对该状态切换作出反应。

public class GlobalDialogMemory{
    public static boolean dialogShown = false;
}

使用CDI时,您可以注入应用程序范围的当前实例(但您应该使用getter / setter和非静态布尔值;)