2013-03-18 2 views
1

J'essaie d'étendre JXDatePicker pour qu'il s'ouvre une fois qu'il a été mis au point. J'ai cherché pour suggérer que je comprends sans succès. Existe-t-il une manière élégante de faire ceci?Ouverture de JXDatePicker lors de la mise au point

+0

comme toujours avec JQuelque chose: ne pas étendre :-) sur l'enfant concerné, pas le parent (comme avec un combo modifiable) – kleopatra

+0

Je suis assez nouveau à Java est là quelque part, je peux obtenir ce genre de conseils. En particulier pour savoir pourquoi on ne devrait pas prolonger un JSomething, semblait une bonne idée et je l'ai fait pour un certain nombre d'autres composants avec un succès apparent :-) Quel désastre me attend? –

+0

@kleopatra aaaach s'il vous plaît :-) cette réponse ne parle pas de quelque chose à propos de Whats Action montrant JXxxXxxPopup avec JXMonthPanel :-) – mKorbel

Répondre

3

Etonnamment, ce n'est pas vraiment possible :-(

Pour une fois, le JXDatePicker lui-même n'a pas api pour afficher/masquer la fenêtre contextuelle (uniquement BasicDatePickerUI a) plus le délégué ui a un peu de magie interne (lire:. Hacks ... toux) qui fait une focusListener pire à manipuler même que d'habitude dans les composants composés

un extrait de jouer avec:.

final JXDatePicker picker = new JXDatePicker(); 
FocusListener l = new FocusListener() { 

    @Override 
    public void focusGained(FocusEvent e) { 
     // no api on the picker, need to use the ui delegate 
     BasicDatePickerUI pickerUI = (BasicDatePickerUI) picker.getUI(); 
     if (!pickerUI.isPopupVisible()) { 
      pickerUI.toggleShowPopup(); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // opening the popup moves the focus to ... ? 
       // need to grab it back onto the editor 
       picker.getEditor().requestFocusInWindow(); 
      } 
     }); 
    } 

    @Override 
    public void focusLost(FocusEvent e) { 
    } 
}; 
// need to register the listener on the editor 
picker.getEditor().addFocusListener(l); 
JComponent content = new JPanel(); 
content.add(new JButton("dummy")); 
content.add(picker); 

Pas vraiment satisfaisant, comme la fermeture automatique de la fenêtre contextuelle sur transférer la mise au point sur à nouveau ne fonctionne pas de manière fiable, a besoin de deux onglets (ne sais pas pourquoi)

+0

merci .......... :-) – mKorbel

Questions connexes