将HashMap绑定到ComboBox

4

有没有人有一个HashMap绑定到ComboBox的示例,以便HashMap中的更改立即反映在ComboBox中?

谢谢!

编辑:

感谢“Hovercraft Full Of Eels”的解决方案:

private Map<String, String> format = new LinkedHashMap<String,String>();

    public class ToComboBoxModel<String> extends AbstractListModel<String> implements MutableComboBoxModel<String> {

        private String selectedItem;

        @Override
        public Object getSelectedItem() {
            return selectedItem;
        }

        @Override
        public void setSelectedItem(Object anItem) {
            // TODO Auto-generated method stub
            for (java.lang.String str : format.keySet()){
                if (anItem.equals(str))
                {
                    selectedItem=(String) str;
                    break;
                }
            }
        }

        @Override
        public String getElementAt(int index) {         
            List<Entry<String,String>> randAccess = new ArrayList<Entry<String,String>>((Collection<? extends Entry<String, String>>) format.entrySet());

            return randAccess.get(index).getKey();
        }

        @Override
        public int getSize() {
            // TODO Auto-generated method stub
            return format.size();
        }

        @Override
        public void removeElement(Object obj) {
            // TODO Auto-generated method stub

        }

        @Override
        public void removeElementAt(int index) {
            // TODO Auto-generated method stub

        }

        @Override
        public void addElement(String item) {


        }

        @Override
        public void insertElementAt(String item, int index) {
            // TODO Auto-generated method stub

        }
    }
1个回答

3
我会创建一个实现MutableComboBoxModel<T>接口的类,并使用TreeMap<T>或其他SortedMap<T>的子类作为其数据核心。我认为您不希望使用HashMap,因为JComboBox的模型需要是有序的,而HashMap是无序的。
该类还应扩展AbstractListModel<E>,以便自动获得ListModel的功能,从而使您无需维护自己的EventListenerList并免费获得上述列表中最后四个方法中的两个,以及一些fireXXX(...)数据更改通知方法。
您必须创建MutableComboBoxModel<T>接口API所要求的必要方法,这只需要实现12个方法。
  • MutableComboBoxModel<E> 的 4 个方法,
    • void addElement(E item) 添加元素
    • void insertElementAt(E item, int index) 在指定位置插入元素
    • void removeElement(E obj) 移除指定元素
    • void removeElementAt(int index) 移除指定位置的元素
  • ComboBoxModel<E> 的 2 个方法,
    • E getSelectedItem() 获取当前选中的元素
    • void setSelectedItem(E item) 设置当前选中的元素
  • ListModel<E> 的 4 个方法,
    • void addListDataListener(ListDataListener listener) 不需要写 -- 是 AbstractListModel 的一部分
    • E getElementAt(int index) 获取指定位置的元素
    • int getSize() 获取列表大小
    • void removeListDataListener(ListDataListener listener) 不需要写 -- 是 AbstractListModel 的一部分

我想这应该是可行的。

编辑:在进一步查看此内容时,我遇到了使用insertElementAt(...)的问题。由于我提倡使用SortedMap作为模型的核心,因此无法将元素任意添加到Map中的某个位置,因为它是按其“自然”顺序排序的。最好使用ArrayList、Vector或其他类似的集合作为模型的数据核心。
编辑2:根据Omid的建议,使用LinkedHashMap更好。

好的,谢谢。但是我该如何将项目添加到列表框中呢? - Omid
2
MutableComboBoxModel达成一致 - mKorbel
1
@Omid:不用谢。我想你是在问如何向模型中添加项目并在JComboBox中显示?如果是这样,那么你的addElement(...)方法将会向模型的内部映射中添加数据,然后调用fireXXX(...)方法通知正在监听的JComboBox。如果这不是你的问题,那么请你澄清一下你的问题。 - Hovercraft Full Of Eels
是的,我正在使用addElement添加项目,但无法调用“firexxx(...)”。需要调用“fireIntervalAdded”吗? - Omid
1
@Omid:那是一个非常明智的选择,如果你不介意的话,我会把它放在我的答案中。给你加1。 - Hovercraft Full Of Eels
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接