JCombobox désactiver l'élément de sélection (faire des combos en lecture seule)

J'aimerais créer un readonly zone de liste déroulante. L'utilisateur ne doit pas être en mesure de sélectionner un autre élément de la liste déroulante. Cela signifie que la liste ne doit pas être ouverte ou doit être vide.

Je vois les solutions suivantes:

  • Définir une zone de liste déroulante modèle avec un seul élément (l'élément sélectionné) ainsi, lorsque l'utilisateur clique sur le bouton de la flèche, d'une liste vide est présenté.
  • Ajouter un PopupMenuListener et dans le popupMenuWillBecomeVisible masquer le menu. C'est problématique: Nous devons appeler combo.hidePopup(); de l'intérieur d'une SwingUtilities.invokeLater()

Le vide d'un modèle d'approche semble un peu maladroit. La deuxième approche montre la liste déroulante pour une fraction de seconde, assez courte pour être remarqué. C'est très laid.

Est-il une troisième solution?

EDIT: solution mise en œuvre:

J'ai mis en œuvre la méthode proposée à partir de splungebob et voici mon code pour référence future:

private void makeComboReadonly() {
  Component editorComponent = box.getEditor().getEditorComponent();
  if (editorComponent instanceof JTextField) {
    ((JTextField) editorComponent).setEditable(false);
  }

  for (Component childComponent : box.getComponents()) {
    if (childComponent instanceof AbstractButton) {
      childComponent.setEnabled(false);
      final MouseListener[] listeners = childComponent.getListeners(MouseListener.class);
      for (MouseListener listener : listeners) {
        childComponent.removeMouseListener(listener);
      }
    }
  }

  final MouseListener[] mouseListeners = box.getListeners(MouseListener.class);
  for (MouseListener listener : mouseListeners) {
    box.removeMouseListener(listener);
  }

  final KeyListener[] keyListeners = box.getListeners(KeyListener.class);
  for (KeyListener keyListener : keyListeners) {
    box.removeKeyListener(keyListener);
  }

  box.setFocusable(false);

  //box.getActionMap().clear(); //no effect
  //box.getInputMap().clear();
}

Le seul problème est l'Événement-Clé Alt-Bas qui oppens le menu pop-up, même si j'ai supprimer toutes les clés d'auditeurs et de préciser l'action de la carte. Je contourner ce problème en faisant le combo non peut recevoir le focus. Pas l'idéal, mais assez bon (-:

Quel est le point de faire un "readonly combobox" si vous êtes ok avec "la liste déroulante ne doit pas être ouverte ou être vide". C'est un JLabel ou un non modifiable JTextField. J'ai pensé que vous voudriez une JComboBox où les autres options sont visibles, mais vous ne pouvez pas changer l'sélectionnée, même si vous cliquez sur un autre élément de la liste.
Un JLabel a une toute autre apparence d'un combo. Le champ n'est pas une option parce que le combo ne pas afficher le champ de texte. Je pense que son étrange si l'utilisateur clique sur un élément, mais rien ne se passe. Readonly composants n'ont généralement pas un indicateur visuel qu'ils sont en lecture seule. Je préfère une solution où le popup n'est pas affiché pour l'utilisateur en premier lieu.
Si, lorsque vous passez la souris sur un élément, il n'obtient aucun indice visuel qui est cliquable (typique de la couleur d'arrière-plan de changement), alors il ne serait pas étrange quand rien ne se passe. Je trouverais plus étrange qu'une zone de liste déroulante, qui est une entrée élément de l'INTERFACE utilisateur de choisir entre les différents éléments n'ont pas de n'importe quel élément, mais a "quelque chose" comme par magie sélectionné. De toute façon il y a 2 solutions faciles: remplacement de la peinture/appel de la pop-up ou juste créer un JComboBox avec seulement 1 point, celui que vous voulez.
Il n'y a aucun moyen de prévenir la liste déroulante pour être réellement ouvert?
Sur une note de côté, appelant hidePopup() à partir de invokeLater ou plutôt à partir de l'EDT n'est pas un problème, en fait, le problème serait de l'appeler à partir de l'extérieur de l'EDT.

OriginalL'auteur morpheus05 | 2014-05-06