简体   繁体   English

如何使用Map元素作为JComboBox的文本

[英]How to use Map element as text of a JComboBox

I am populating a JComboBox (using addItem() ) with all the elements of a collection. 我正在使用集合的所有元素填充JComboBox(使用addItem() )。 Each element in the collection is a HashMap (so its a ComboBox of Hashmaps..). 集合中的每个元素都是HashMap (因此它是Hashmaps的ComboBox ..)。

My question is - Given that I need each item to be a HashMap how do I set the text to apear in the combobox on the GUI? 我的问题是 - 鉴于我需要每个项目都是HashMap如何在GUI上的组合框中将文本设置为apear? It needs to be the value of a certain key in the map. 它必须是地图中某个键的值。 Normally if I am populating a combobox with my own type, I would just overide the toString() method...but I am not sure how to acheive this since I am using a Java HashMap. 通常,如果我使用自己的类型填充组合框,我只会覆盖toString()方法...但我不知道如何实现这一点,因为我使用的是Java HashMap。

Any ideas (if possible, without implementing my own HashMap)? 任何想法(如果可能的话,没有实现我自己的HashMap)?

Update : It seems like there isn't anyway to avoid having the object int the JComboBox overide toString() if I want custom functionality..I wish there was a way to (1) specify the objects to be loaded into the JComboBox and (2) specify how these objects are to appear in the GUI. 更新 :似乎没有办法避免让对象在JComboBox上面覆盖toString()如果我想要自定义功能..我希望有一种方法可以(1)指定要加载到JComboBox中的对象和( 2)指定这些对象在GUI中的显示方式。

(2) specify how these objects are to appear in the GUI. (2)指定这些对象在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: 显示toString()方法和自定义渲染器方法的简单示例:

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 );
     }

}

如果要覆盖toString()方法,您可以创建一个实现Map的装饰器类,并使用HashMap实现所需的方法并提供自己的toString()

If you have a hashmap, you will want to do something like: 如果你有一个hashmap,你会想做类似的事情:

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

Of course, you have to override the toString method of the object you have in the HashMap 当然,您必须覆盖HashMap对象的toString方法

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM