2015-12-27 64 views
3

我的JavaFX 8应用程序在获得专注时必须登录到doStuff()。这是相当简单:如何应对从另一个应用程序获取焦点?

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

然而,当我显示一个对话框,用户关闭它,doStuff()火灾。我希望它只在用户从另一个应用切换到我的时候才会触发,例如Alt + 选项卡来自浏览器。

换句话说,我想doStuff() iff其他应用程序的窗口失去焦点,我的应用程序窗口变得焦点。

可能吗?

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

扩展Dialog自动执行它不是一个选项,因为我想使用已经扩展原始Dialog的内置对话框。

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

回答

1

我建议在您的对话框中添加一个侦听器,然后如果对话框刚刚关闭/失去焦点,则允许您不做doStuff()。

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

+0

这样做,每一个对话听起来并不很有趣。我希望有一种方法可以自动处理它。 – gronostaj

+0

hmmm,我建议创建一个(阵列)即时对话框列表,为听众创建一个小的子类,并实现向该列表添加一个Instant,然后检查每个Instant。效率不高,但我认为它会奏效。 – Appelemac

1

当你打开这样的对话框,并且只有当这个全局开关是真/假/无论你选择那么你可以对该状态开关作出反应时,你可以使用全局布尔值。

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

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

相关问题