如何隐藏或关闭弹出菜单 JDateChooser?

How can i hide or close popupmenu JDateChooser?

我在一个框架中使用 JDateChooser 和一些组合框。当我在 JDateChooser 中打开 popupcalendar 并在外部单击鼠标时,此弹出菜单关闭。

问题: 当我打开此日历然后单击任何组合框时,日历弹出菜单不会关闭。为什么它会停止运行以及我如何在代码中关闭或隐藏它。

我试过这样 popup.setVisible(false), 但它不起作用。如果我尝试像
popup.hide() 弹出菜单永远不会关闭。

尝试isShowingPopup = false;

 private void PopMenuFocusLost(java.awt.event.FocusEvent evt) {                                           


isShowingPopup = false;
    }   

我遇到了与 OP 相同的问题,但是接受的答案并没有真正帮助我。不过我找到了解决方案,所以我想我会 post 在这里。

查看 JDateChooser (1.4) 的源代码,我在构造函数中遇到了这个:

popup = new JPopupMenu() {
    private static final long serialVersionUID = -6078272560337577761L;

    public void setVisible(boolean b) {
        Boolean isCanceled = (Boolean) getClientProperty("JPopupMenu.firePopupMenuCanceled");
        if (b
            || (!b && dateSelected)
            || ((isCanceled != null) && !b && isCanceled.booleanValue())) {
                super.setVisible(b);
        }
    }
};
popup.setLightWeightPopupEnabled(true);
popup.add(jcalendar);

请注意弹出窗口的 "setVisible" 方法是如何被自定义功能覆盖的。这似乎与组合框不兼容。

为了解决这个问题,我使用了自己的 class,扩展了 JDateChooser,并将其添加到我的构造函数中:

this.popup = new JPopupMenu();
this.popup.setLightWeightPopupEnabled(true);
this.popup.add(this.jcalendar);

基本上我们正在重新定义弹出窗口以不覆盖 setVisible 功能。当我单击组合框时,弹出窗口现在可以正确隐藏。

编辑 经过进一步测试,我发现如果日期选择器中的组合框不关闭(大问题),我将无法再从日期选择器中的组合框每月 select 。请参阅下面我修改后的自定义日期选择器的完整代码 class:

public class CustomDateChooser extends JDateChooser {

public CustomDateChooser() {
    super();

    this.popup = new JPopupMenu() {
        @Override
        public void setVisible(final boolean b) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    handleVisibility(b);
                }
            });
        }

        private void handleVisibility(boolean b) {
            if (!jcalendar.getMonthChooser().getComboBox().hasFocus()) {
                super.setVisible(b);
            }
        }
    };

    this.popup.setLightWeightPopupEnabled(true);
    this.popup.add(this.jcalendar);
}
}

通过覆盖 JPopupMenu 的 setVisible() 方法,我们现在仅在月份选择器组合框没有焦点时调用 setVisible。请注意,我们必须使用线程 (invokeLater) 来完成这项工作,否则代码将在组合框实际获得焦点之前执行。