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

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

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

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

        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());

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

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

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

最佳答案
所以,经过几天的玩弄,我有一个粗略的解决方法,虽然它是一个黑客的全部含义.

虽然弹出行为仍然让我感到困惑,但我可以通过将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());
                    }
                }
            }

        });

从不介意我正在检查的那些标志中的一些,它们只是一些内部工具,以确保仅在程序处于正确状态时才显示弹出窗口.

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

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

转载注明原文:失去焦点后,Javafx弹出窗口不会隐藏在其他应用程序后面 - 代码日志