失去焦点后,Javafx弹出窗口不会隐藏在其他应用程序后面

所以我的问题,正如标题中所说的那样,是关于Javafx(即2.2)Popup在某些方面的行为。 大多数情况下,你得到一个弹出窗口,你给它一个窗口作为它的父母,你给它一些场景,它往往相对独立。

这一切都很好,但是,在我的情况下,我需要一个弹出窗口,当事件发生时,它会将自己锚定到特定位置(窗口),特定位置。 然后,当窗口消失时(最小化,屏幕外,无论如何),弹出窗口将会消失,当它完成时移动,并且在所有的本质和function中,只是具有自定义形状的窗口的物理扩展。

当然,现在有很多细微差别,而且大部分内容都很有效。 我似乎无法弄清楚的唯一一件事就是通常在像Windows 7 64位这样的平台上。 你打开两个程序,好吧。 然后,如果程序重叠一点,无论哪个有焦点都可以显示整个程序,而另一个给人的印象是“在另一个窗口后面”。 (当另一个人专注于同一个地方时,无论窗口是否真的将应用程序图形渲染到窗口后面,我都不确定。) 通常,javafx也支持这个function。 但出于某种原因,javafx中的Popup类(参见此处的文档)并没有这样做。 无论如何,它总是在它显示的任何内容之上。 为了完整性,这里是我非常简单的弹出代码(至少有关于显示它和它的属性的部分):

Popup myPop = new Popup(); //************************Popup Property Setter************************** //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& myPop.setWidth(width); myPop.setHeight(initialHeight); myPop.setAutoHide(false); myPop.setAutoFix(false); myPop.setHideOnEscape(false); myPop.setX(xLocation); myPop.setY(yLocation); //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //**********************end of Popup Properties************************** myPop.getContent().add(main_anchor); myPop.show(FileChooserWindow.get_stage()); 

主锚有一些不同的组件,我包含在’myPop’弹出窗口内,而FileChooserWindow是一个非空的父窗口,在此方法调用时将无exception地打开。

这是我所指的行为的截图。 请注意pdf中突出显示的文本,即我的光标当前具有焦点的位置。 此外,弹出窗口固定的窗口可以在从左侧伸出的pdf背面看到。 顽固的弹出窗口的图像

你们给予的任何帮助都将非常感激。 我真的希望我不必检查活动进程以及它们相对于弹出窗口的位置,这是危险地接近我的知识边界,听起来像一个完整的PITA。

所以,经过几天的玩弄,我有一个粗略的解决方法,虽然它是一个黑客的术语的全部意义。

虽然弹出行为仍然让我感到困惑,但是我可以通过将changeListener添加到它附加到的舞台来模拟这种行为的修复(因为我不希望弹出窗口关闭,如果它的父窗口有焦点,只有在任何情况下但弹出窗口和它的父母得到了关注)。

请参阅以下代码:

 FileChooserWindow.get_stage().focusedProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue ov, Boolean oldValue, Boolean newValue) { if (!newValue){ if(AutogenPopup.popupReturner().focusedProperty().get()){ AutogenPopup.popupReturner().hide(); } }else{ if(FileChooserController.refreshAutoPopup && FileChooserController.autoGen_flag){ AutogenPopup.popupReturner().show(FileChooserWindow.get_stage()); } } } }); 

没关系我正在检查的那些标志,它们只是一些内部工具,以确保只在程序处于正确状态时弹出窗口。

现在,有一点值得注意。 AutogenPopup.popupReturner().focusedProperty().get()当弹出窗口的父窗口LOST焦点时, AutogenPopup.popupReturner().focusedProperty().get()返回true。 这对我来说是非常反直觉的,而且在我看来,甚至是一个触摸手推车。 现在,这并不模拟现代操作系统的行为,其中窗口可以逐渐滑入和滑出焦点,因为弹出窗口将在父窗口失去焦点时完全消失。 但是看看我的弹出窗口如何在主窗口侧面显示额外的文本条目,这是一个可接受的折衷方案,直到我想到一个更好的解决方案。 (也许更好的解决方案是根本不使用弹出窗口,而是将窗口设置为以弹出方式操作)。

无论如何,我希望这有助于某人,也许最终会有一种更细粒度的方式来控制这个弹出function。