Search code examples
javaswingjcomboboxpromptlistcellrenderer

display a non-selectable default value for JComboBox


I have a JComboBox that contains three Items {"Personel", "Magasinier", "Fournisseur"}.

I want this JComboBox to display the value "Choisir une option :", which is a non-selectable value.

I tried this code after initComponents(); :

this.jComboBox1.setSelectedItem("Choisir une option :");

but it doesn't work.

How can I do that ?


Solution

  • You could override the selection code in your JComboBox model, with code such as the following SSCCE:

    public class JComboExample {
    
      private static JFrame frame = new JFrame();
      private static final String NOT_SELECTABLE_OPTION = " - Select an Option - ";
      private static final String NORMAL_OPTION = "Normal Option";
    
      public static void main(String[] args) throws Exception {
        JComboBox<String> comboBox = new JComboBox<String>();
    
        comboBox.setModel(new DefaultComboBoxModel<String>() {
          private static final long serialVersionUID = 1L;
          boolean selectionAllowed = true;
    
          @Override
          public void setSelectedItem(Object anObject) {
            if (!NOT_SELECTABLE_OPTION.equals(anObject)) {
              super.setSelectedItem(anObject);
            } else if (selectionAllowed) {
              // Allow this just once
              selectionAllowed = false;
              super.setSelectedItem(anObject);
            }
          }
        });
    
        comboBox.addItem(NOT_SELECTABLE_OPTION);
        comboBox.addItem(NORMAL_OPTION);
    
        frame.add(comboBox);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
            frame.setVisible(true);
          }
        });
      }
    }
    

    This will display a combo box with the intial selection of "- Select an Option -". As soon as the user selects another option, it will not be possible to select the original option again.