如何隐藏或关闭popupmenu JDateChooser?

时间:2015-07-16 14:31:08

标签: java swing jdatechooser jcalendar

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

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

我试试这样 popup.setVisible(false), 但它不起作用。如果我尝试
popup.hide() popupmenu永远不会关闭。

2 个答案:

答案 0 :(得分:3)

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

查看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"弹出窗口的方法被自定义功能覆盖。有一些关于这一点似乎与组合框不太合适。

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

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

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

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

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)来使其工作,否则代码将在组合框实际获得焦点之前执行。

答案 1 :(得分:-1)

尝试isShowingPopup = false;

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


isShowingPopup = false;
    }