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

Wil*_*lBD 5 java user-interface popup javafx-2

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

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

当然,现在有很多细微差别,而且大部分内容都很有效.我似乎无法弄清楚的唯一一件事就是通常在像Windows 7 64位这样的平台上.你打开两个程序,好吧.然后,如果程序重叠一点,无论哪个有焦点都可以显示整个程序,而另一个给出的印象是"在另一个窗口后面".(当另一个人专注于同一个地方时,无论窗口是否实际上将应用程序图形渲染到窗口后面,我都不确定.)通常,javafx也支持这个功能.但出于某种原因,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());
Run Code Online (Sandbox Code Playgroud)

main锚有一些不同的组件,我包含在'myPop'弹出窗口内,而FileChooserWindow是一个非null的父窗口,在此方法调用时将无异常地打开.

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

你们给予的任何帮助都将非常感激.我真的希望我不必检查活动进程和它们相对于弹出窗口的位置,这种方式越来越接近我的知识边界,听起来就像一个完整的PITA.

Wil*_*lBD 3

因此,在尝试了几天之后,我有了一个粗略的解决方法,尽管它是一个真正意义上的黑客。

尽管弹出窗口的行为仍然让我感到困惑,但我可以通过向其附加的阶段添加一个changeListener来模拟此行为的修复(因为我不希望弹出窗口在其父窗口具有焦点时关闭,除非有任何情况)但弹出窗口及其父窗口获得了焦点)。

见代码如下:

FileChooserWindow.get_stage().focusedProperty().addListener(new ChangeListener<Boolean>(){
            @Override
            public void changed(ObservableValue<? extends Boolean> 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());
                    }
                }
            }

        });
Run Code Online (Sandbox Code Playgroud)

别介意我正在检查的一些标志,它们只是一些内部工具,以确保弹出窗口仅在程序处于正确状态时出现。

现在,需要注意一件有趣的事情。当弹出窗口的父窗口失去焦点时,似乎AutogenPopup.popupReturner().focusedProperty().get() 返回 true。这对我来说是相当违反直觉的,在我看来,这甚至是一辆触摸车。现在,这并不能模拟现代操作系统的行为,其中窗口可以逐渐滑入和滑出焦点,因为弹出窗口在其父窗口失去焦点时将完全消失。但鉴于我的弹出窗口仅在主窗口侧面显示附加文本输入,在我想到更好的解决方案之前,这是一个可以接受的妥协。(也许更好的解决方案是根本不使用弹出窗口,而是对窗口进行皮肤处理,以弹出窗口的方式进行操作)。

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