JavaFx如何在所有者窗口上单击鼠标时隐藏弹出窗口?

时间:2013-11-26 10:43:46

标签: popup javafx-2

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

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

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

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

2 个答案:

答案 0 :(得分:4)

使用FX 8,您只需执行

即可
popup.setAutoHide(true)

答案 1 :(得分:1)

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

在弹出窗口中:

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