【问题标题】:Javafx popup won't hide behind other application upon losing focusJavafx 弹出窗口在失去焦点时不会隐藏在其他应用程序后面
【发布时间】:2014-03-08 09:13:15
【问题描述】:

所以我的问题,如标题中所述(有点),是关于 Javafx(即 2.2)弹出窗口的某些方面的行为。大多数时候,你会得到一个弹出窗口,然后给它一个窗口来充当它的父级,你给它一些场景,它往往会相对独立地行动。

这一切都很好,但是,就我而言,我需要一个弹出窗口,当事件发生时,它可以将自身锚定到特定位置的特定阶段(窗口)。然后,该弹出窗口会在窗口消失时消失(最小化,屏幕外,等等),在它会移动时移动,并且在所有本质和功能上,它是窗口的物理扩展,只是具有自定义形状。

当然,这有很多细微差别,而且大多数情况下,一切都很好。我似乎唯一想不通的是,通常在像 Windows 7 64 位这样的平台上。你打开两个程序,好吧。然后,如果程序有一点重叠,则无论哪个具有焦点,都会显示整个程序,而另一个则给人的印象是在另一个窗口“后面”。 (当另一个窗口聚焦在同一个位置时,Windows 是否真的在窗口“后面”渲染应用程序图形,我不确定。)。通常,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());

主锚点有一些我在“myPop”弹出窗口中包含的各种组件,并且 FileChooserWindow 是一个非空父窗口,它将在此方法调用时毫无例外地打开。

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

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

【问题讨论】:

    标签: java user-interface popup javafx-2


    【解决方案1】:

    因此,在玩弄了几天之后,我有了一个粗略的解决方法,尽管它完全是一个 hack。

    虽然弹出窗口的行为仍然让我感到困惑,但我可以通过在它所附加的阶段添加一个 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() 当弹出窗口的父窗口失去焦点时,似乎返回 true。这对我来说是非常违反直觉的,在我看来,这甚至是一个触摸错误。现在,这并不能模拟现代操作系统的行为,其中窗口可以逐渐滑入和滑出焦点,因为弹出窗口将在其父窗口失去焦点时完全消失。但是看到我的弹出窗口如何在主窗口的一侧显示额外的文本条目,这是一个可以接受的折衷方案,直到我想到更好的解决方案。 (也许更好的解决方案是根本不使用弹出窗口,而是给窗口蒙皮以以弹出式方式运行)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多