6 votes

Comment faire ressembler JCombobox à un JTextField ?

Existe-t-il un bon moyen (et facile) de faire ressembler une JCombobox à un JTextField ? Je veux dire par là qu'il ne devrait pas y avoir de bouton déroulant, mais que lorsque l'utilisateur saisit quelque chose, il devrait afficher plusieurs résultats.

Il s'agit en fait du même fonctionnement que celui de Google, Youtube, Facebook, etc.

6voto

Markus Jevring Points 458
JComboBox comboBox = new JComboBox();
comboBox.setUI(new BasicComboBoxUI() {
    @Override
    protected JButton createArrowButton() {
        return new JButton() {
            @Override
            public int getWidth() {
                return 0;
            }
        };
    }
});

Le fait que getWidth() renvoie 0 permet de s'en assurer :
a) le bouton n'est pas affiché
b) aucun espace n'est réservé à cet effet, ce qui vous permet de taper dans tout le champ.

J'ai découvert que je devais invoquer .setUI() via SwingUtilities.invokeLater() mais selon la structure de votre code, vous n'aurez peut-être pas à le faire.

Si vous souhaitez une saisie semi-automatique, ajoutez des éléments à la liste déroulante et utilisez la fonction AutoCompleteDecorator.decorate(comboBox) . Les AutoCompleteDecorator fait partie de la classe SwingX comme indiqué précédemment.

Cela peut donner un aspect bizarre à votre boîte lorsque vous utilisez un autre L&F, et vous devrez donc choisir quelle CombiBoxUI instancier, pour obtenir le bon aspect.

Si vous ne souhaitez pas que la liste déroulante apparaisse lorsque la boîte combo ne contient rien, remplacez également cette méthode dans la BasicComboBoxUI :

@Override
public void setPopupVisible(JComboBox c, boolean v) {
    // keeps the popup from coming down if there's nothing in the combo box
    if (c.getItemCount() > 0) {
        super.setPopupVisible(c, v);
    }
}

2voto

Mark Points 14208

Voulez-vous dire que vous voulez qu'il se comporte comme un champ de texte qui se remplit automatiquement en fonction des valeurs précédemment saisies ? SwingX inclut la prise en charge de l'ajout d'une autocomplétion aux composants textuels.

Une autre bibliothèque que vous pourriez consulter est Couche commune JIDE . La fonctionnalité IntelliHints pourrait correspondre à ce que vous recherchez. Une démo peut être téléchargée à l'adresse suivante ici .

2voto

Justin Points 2376

J'ai un problème très similaire, je ne me soucie pas de la flèche popup, mais j'ai besoin de contrôler l'apparence du texte lorsque le composant est désactivé.

Je souhaite afficher la valeur actuelle, mais désactiver la sélection/édition de la liste. La seule façon d'obtenir ce comportement avec JComboBox est d'utiliser comboBox.setEnabled(false) ; ce qui donne au texte un gris clair illisible.

J'ai créé un ComoBoxUIDecorator et j'ai intercepté certaines méthodes de peinture. L'effet est exactement le même : la flèche apparaît en gris, tandis que la valeur actuelle apparaît en noir et est lisible (comme si elle était activée).

public class ComboBoxUIDecorator extends ComboBoxUI {
 private ComboBoxUI m_parent;

 public ComboBoxUIDecorator(ComboBoxUI x) {
  m_parent = x;
 }
 ...
 public boolean isFocusTraversable(JComboBox c) {
  return m_parent.isFocusTraversable(c);
 }

 public void paint(Graphics g, JComponent c) {
  c.setEnabled(m_displayEnabledState);
  m_parent.paint(g, c);
  c.setEnabled(m_realEnabledState);
 }
}

Vous pouvez essayer une approche similaire ; si vous pouvez trouver le bouton de la flèche, vous pouvez peindre sur la flèche après avoir invoqué m_parent.paint()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X