嗨我有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()我可以隐藏弹出窗口。 如果弹出窗口显示在初级阶段,如何隐藏弹出窗口?
答案 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