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

时间:2014-02-10 20:36:54

标签: java user-interface popup javafx-2

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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());
                    }
                }
            }

        });

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

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

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