I am using this Java code in my swing application to show an input dialog that has a drop-down selection list so a user can select an item from that list :
String[] carModelsArray = { "Honda", "Mitsubishi", "Toyota" };
String selectedValue = (String)JOptionPane.showInputDialog( null, "Select a car model from the list below:", "Car model...",
                                        JOptionPane.QUESTION_MESSAGE, 
                                        null, 
                                        carModelsArray,
                                        carModelsArray[ 0 ] );
This code works fine, but i was wondering if i can also add an icon for each item in the selection list, so the drop-down selection list would appear like this :

I have tried to set the items in this list as JLabel items, but the JLabel objects were all converted to String values when rendered inside the drop-down list as if it calls the JLabel.toString() method for each item in the list to get its value.
So is there a way to accomplish this ?
Short answer, not the way you're doing it. Long answer, something more like...

import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.kaizen.icons.AddIcon;
import org.kaizen.icons.DeleteIcon01;
import org.kaizen.icons.DeleteIcon02;
public class Test {
    public static void main(String[] args) {
        new Test();
    }
    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }
                DefaultComboBoxModel model = new DefaultComboBoxModel<Car>();
                model.addElement(new Car(new AddIcon(16, 16), "Honda"));
                model.addElement(new Car(new DeleteIcon01(16, 16), "Mitsubishi"));
                model.addElement(new Car(new DeleteIcon02(16, 16), "Tyota"));
                JComboBox cb = new JComboBox(model);
                cb.setRenderer(new CarListCellRenderer());
                int result = JOptionPane.showConfirmDialog(null, cb, "Select a car model from the list below", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (result == JOptionPane.OK_OPTION) {
                    Car car = (Car) cb.getSelectedItem();
                }
            }
        });
    }
    public static class CarListCellRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            System.out.println(value);
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof Car) {
                Car car = (Car) value;
                setIcon(car.getIcon());
                setText(car.getText());
            } else {
                setIcon(null);
            }
            return this;
        }
    }
    public static class Car {
        private Icon icon;
        private String text;
        public Car(Icon icon, String text) {
            this.icon = icon;
            this.text = text;
        }
        public Icon getIcon() {
            return icon;
        }
        public String getText() {
            return text;
        }
    }
}
Essentially, you need to take control over the combobox and provide your own custom ListCellRedender which can provide the output you desire...
Thanks to MadProgrammer for his helpful answer, i was able to use his idea to find a solution for this. Here is how the final result looks like :

And here is the code i have used :
public class MyClass extends JFrame {
    private JComboBox inputComboBox = null;
    private void button6ActionPerformed() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel inputPanel = createPanel();
                int result = JOptionPane.showConfirmDialog(null, inputPanel, "Car model...", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (result == JOptionPane.OK_OPTION) {
                    System.out.println( (String)inputComboBox.getSelectedItem() );
                }
            }
        });   
    }
    private JPanel createPanel() {
        CellConstraints cc = new CellConstraints();
        //1. Create JPanel :
            JPanel inputPanel = new JPanel();
            inputPanel.setLayout(new FormLayout(
                new ColumnSpec[] {
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13)),
                    FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                    new ColumnSpec(Sizes.dluX(13))
                },
                new RowSpec[] {
                    new RowSpec(Sizes.dluY(13)),
                    FormFactory.LINE_GAP_ROWSPEC,
                    new RowSpec(Sizes.dluY(13)),
                    FormFactory.LINE_GAP_ROWSPEC,
                    new RowSpec(Sizes.dluY(13))
                }));
        //2. Create JLabel :
            JLabel inputLabel = new JLabel( "Select a car model from the list below :" );
            inputPanel.add( inputLabel, cc.xywh( 1, 1, 15, 1 ) );
        //3. Create ComboBox :
            DefaultComboBoxModel model = new DefaultComboBoxModel();
            model.addElement("Honda");
            model.addElement("Mitsubishi");
            model.addElement("Toyota");
            inputComboBox = new JComboBox( model );
            inputComboBox.setRenderer( new ComboBoxRenderer() );
            inputPanel.add( inputComboBox, cc.xywh(1, 3, 10, 2 ) );
         return inputPanel;
    }
}
class ComboBoxRenderer extends JLabel implements ListCellRenderer { 
    public Component getListCellRendererComponent(
                    JList list,
                    Object selectedCarModel,
                    int selectedModelIndex,
                    boolean isSelected,
                    boolean cellHasFocus) {
        //1. Set the list item text, icon & styling properties :
            String carModel = (String)selectedCarModel;
            String iconPath = "/images/" + carModel.toLowerCase() + ".png";  // The icon file should have the same name of the car model.
            URL iconURL = getClass().getResource( iconPath );
            setText( carModel );
            setIcon( new ImageIcon( iconURL ) );
            setPreferredSize( new Dimension( list.getWidth(), 30 ) );
        //2. Set the selected/deselected list item selection colors : 
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
        return this;
    }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With