我的JavaFX 8应用程序在集中注意力时必须doStuff()
。这很简单:
primaryStage.focusedProperty().addListener((observable, wasFocused, nowFocused) -> {
doStuff();
});
但是,当我显示一个对话框并且用户将其关闭时,doStuff()
会触发。我希望它只在用户从另一个应用程序切换到我的应用程序时触发,例如来自浏览器的 Alt + Tab 。
换句话说,我希望doStuff()
如果其他应用的窗口失去焦点,我的应用窗口就会聚焦。
有可能吗?
编辑: FibreFoX和Appelemac发布的答案要求在显示对话框之前明确执行其他步骤。这个解决方案远非完美,因为我(或者任何开发人员)在显示对话之前必须记住这一步。忘记它会引入难以发现的错误。
扩展Dialog
以自动执行此操作不是一种选择,因为我想使用已扩展原始Dialog
的内置对话框。
这是非常基本的功能,如果在JavaFX中没有简单的方法可以实现这一点,我会感到惊讶。
答案 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和非静态布尔值;)