gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:31:05 24 4
gpt4 key购买 nike

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

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

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

最佳答案

我遇到了与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)来完成这项工作,否则代码将在组合框实际获得焦点之前执行。

关于java - 如何隐藏或关闭弹出菜单 JDateChooser?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com