【问题标题】:JavaFx how to hide popup when mouse is clicked on owner window?JavaFx如何在所有者窗口上单击鼠标时隐藏弹出窗口?
【发布时间】:2013-11-26 10:43:46
【问题描述】:

您好,我有一个只有一个阶段的 javafx 应用程序。在文本字段的选项卡按键事件中,应用程序的主要阶段显示一个弹出窗口。如下所示

    private void tripNoKeyPressEventAction(KeyEvent event){
            if(event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.ENTER) {
                popup.show(GateIn.primaryStage);
            }
        }
popup.requestFocus();
        popup.focusedProperty().addListener(new ChangeListener<Boolean>
        () {

            @Override
            public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
               if(t1==false)
               {
                   System.out.println("focus lost");
                   popup.hide();
               }
            }
        });

我没有点击弹出窗口,也没有在弹出窗口中选择任何内容。我将单击它后面的舞台。我希望弹出窗口关闭,但在执行弹出窗口的focusedProperty 侦听器之前它给了我IllegalArgumentException。

如果弹出窗口在不同的阶段(除了应用程序的主要阶段),基于阶段focusedProperty()我可以隐藏弹出窗口。 如果弹出窗口显示在初级阶段,如何隐藏弹出窗口?

【问题讨论】:

    标签: popup javafx-2


    【解决方案1】:

    使用 FX 8,您可以轻松做到

    popup.setAutoHide(true)
    

    【讨论】:

    • 它使它不可见。我可以让它可见但带走焦点吗? (即使我点击了外面,它目前正在窃取所有键盘事件)
    【解决方案2】:

    您应该为大多数顶级窗口设置一个事件调度程序,然后所有事件都会穿过它。

    在弹出窗口中:

    getScene().getWindow().setEventDispatcher((event, tail) -> {
            if (event.getEventType() == RedirectedEvent.REDIRECTED) {
                //  RedirectedEvent is a box that contains original event from other target
                RedirectedEvent ev = (RedirectedEvent) event;
                if (ev.getOriginalEvent().getEventType() == MouseEvent.MOUSE_PRESSED) {
                    hide();
                }
            }else {
                //  if click in the popup window. handle the event by default
                tail.dispatchEvent(event);
            }
            return null;
        });
    

    更多信息请查看javafx.event.EventDispatcher

    【讨论】:

    • 这是一个有趣的解决方案,但在当前的 JavaFX 版本中,RedirectedEvent 是私有 API 的一部分。使用“event.getEventType().getName().equals("REDIRECTED")”仍然可以检测到它,但是getOriginalEvent() 不可用
    猜你喜欢
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多