如何隐藏或关闭弹出菜单 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) 来完成这项工作,否则代码将在组合框实际获得焦点之前执行。
我在一个框架中使用 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) 来完成这项工作,否则代码将在组合框实际获得焦点之前执行。