У меня была такая же проблема, как ОП, однако принятый ответ не реально помочь мне. Я нашел решение, поэтому, я думал, что разместил его здесь.
Просматривая исходный код для 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 функциональности. Всплывающее окно теперь скрывается должным образом, когда я нажимаю на комбинированные поля.
EDIT После дальнейшего тестирования я обнаружил, что я больше не мог выбрать месяц из выпадающего списка в дату Chooser без него закрытия (большая проблема). Ниже приведен полный код из моего пересмотренного пользовательского класса Дата Chooser:
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);
}
}
Переопределелив() метод SetVisible JPopupMenu, мы теперь только вызывая SetVisible когда выпадающий месяц Chooser не имеет фокус. Обратите внимание, что для выполнения этой работы мы должны использовать threading (invokeLater), иначе код будет выполняться до того, как поле со списком действительно получит фокус.
Не могли бы вы предоставить нам [MCVE] (http://stackoverflow.com/help/mcve)? –