How to use Map element as text of a JComboBox

前端 未结 3 1816
别跟我提以往
别跟我提以往 2020-12-03 15:20

I am populating a JComboBox (using addItem()) with all the elements of a collection. Each element in the collection is a HashMap (so its a ComboBo

相关标签:
3条回答
  • 2020-12-03 16:06

    If you have a hashmap, you will want to do something like:

    JComboBox box = new JComboBox(hashMap.getValues().toArray());
    

    Of course, you have to override the toString method of the object you have in the HashMap

    0 讨论(0)
  • 2020-12-03 16:16

    (2) specify how these objects are to appear in the GUI.

    You can add any Object to the model and then create a custom renderer to display the object any way you want. Simple example that shows the toString() approach and custom renderer approach:

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.plaf.basic.*;
    
    public class ComboBoxItem extends JFrame implements ActionListener
    {
        public ComboBoxItem()
        {
            Vector model = new Vector();
            model.addElement( new Item(1, "car" ) );
            model.addElement( new Item(2, "plane" ) );
            model.addElement( new Item(3, "train" ) );
            model.addElement( new Item(4, "boat" ) );
    
            JComboBox comboBox;
    
            //  Easiest approach is to just override toString() method
            //  of the Item class
    
            comboBox = new JComboBox( model );
            comboBox.setDragEnabled(true);
            comboBox.addActionListener( this );
            getContentPane().add(comboBox, BorderLayout.NORTH );
    
            //  Most flexible approach is to create a custom render
            //  to diplay the Item data
    
            comboBox = new JComboBox( model );
            comboBox.setDragEnabled(true);
            comboBox.setRenderer( new ItemRenderer() );
            comboBox.addActionListener( this );
            getContentPane().add(comboBox, BorderLayout.SOUTH );
        }
    
        public void actionPerformed(ActionEvent e)
        {
            JComboBox comboBox = (JComboBox)e.getSource();
            Item item = (Item)comboBox.getSelectedItem();
            System.out.println( item.getId() + " : " + item.getDescription() );
        }
    
        class ItemRenderer extends BasicComboBoxRenderer
        {
            public Component getListCellRendererComponent(
                JList list, Object value, int index,
                boolean isSelected, boolean cellHasFocus)
            {
                super.getListCellRendererComponent(list, value, index,
                    isSelected, cellHasFocus);
    
                if (value != null)
                {
                    Item item = (Item)value;
                    setText( item.getDescription().toUpperCase() );
                }
    
                if (index == -1)
                {
                    Item item = (Item)value;
                    setText( "" + item.getId() );
                }
    
    
                return this;
            }
        }
    
        class Item
        {
            private int id;
            private String description;
    
            public Item(int id, String description)
            {
                this.id = id;
                this.description = description;
            }
    
            public int getId()
            {
                return id;
            }
    
            public String getDescription()
            {
                return description;
            }
    
            public String toString()
            {
                return description;
            }
        }
    
        public static void main(String[] args)
        {
            JFrame frame = new ComboBoxItem();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.pack();
            frame.setVisible( true );
         }
    
    }
    
    0 讨论(0)
  • 2020-12-03 16:16

    If you want to override the toString() method you could just create a decorator class that implements Map and uses a HashMap to implemented the needed methods and give your own implementation of toString().

    0 讨论(0)
提交回复
热议问题