2015-07-16 6 views
0

Я использую JDateChooser и некоторые combobox в одном кадре. Когда я открываю popupcalendar в JDateChooser и нажимаю кнопку мыши, это всплывающее меню закрывается.Как я могу скрыть или закрыть popupmenu JDateChooser?

Проблема: Когда я открываю этот календарь, а затем выбираю любое поле со списком, календарь popupmenu не закрывается. Почему он работает и как я могу закрыть или скрыть его в коде.

Я пробовал так вот popup.setVisible(false), но он не работает. если я попробую
popup.hide() popupmenu никогда не будет закрыт.

+2

Не могли бы вы предоставить нам [MCVE] (http://stackoverflow.com/help/mcve)? –

ответ

0

попробовать isShowingPopup = false;

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


isShowingPopup = false; 
    } 
2

У меня была такая же проблема, как ОП, однако принятый ответ не реально помочь мне. Я нашел решение, поэтому, я думал, что разместил его здесь.

Просматривая исходный код для 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), иначе код будет выполняться до того, как поле со списком действительно получит фокус.