4

有没有人有一个如何将 HashMap 的键绑定到 ComboBox 以便 HashMap 中的更改立即反映到 ComboBox 的示例?

谢谢!

编辑:

感谢“充满鳗鱼的气垫船”的解决方案:

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

        }
    }
4

1 回答 1

3

我将创建一个实现MutableComboBoxModel<T>接口的类,并让它使用它的一个TreeMap<T>或其他子级SortedMap<T>作为其数据核。我认为您不想使用 aHashMap因为需要订购 JComboBox 的模型并且未订购 HashMap 。

该类还应该扩展AbstractListModel<E>,以便自动获得 ListModel 的功能,使您不必维护自己的 EventListenerList 并免费为您提供我上面列表中底部四个方法中的两个,以及一些fireXXX(...)数据更改通知方法。

您必须做的是创建由MutableComboBoxModel<T>接口的API规定的必要方法。这仅意味着实现 12 种方法,

  • 4 个MutableComboBoxModel<E>
    • void addElement(E item)
    • void insertElementAt(E item, int index)
    • void removeElement(E obj)
    • void removeElementAt(int index)
  • 2 个ComboBoxModel<E>
    • E getSelectedItem()
    • void setSelectedItem(E item)
  • 和 4 个ListModel<E>
    • void addListDataListener(ListDataListener listener)无需编写——AbstractListModel 的一部分
    • E getElementAt(int index)
    • int getSize()
    • void removeListDataListener(ListDataListener listener)无需编写——AbstractListModel 的一部分

我应该认为,这应该是可行的。

编辑:再看一遍,我遇到了insertElementAt(...). 由于我提倡将 SortedMap 作为模型的核心,因此您不能将元素任意添加到 Map 中的 a 位置,因为它是按其“自然”顺序排序的。这最适合使用 ArrayList、Vector 或其他类似集合作为模型的数据核。

编辑 2 :根据 Omid 的建议使用LinkedHashMap要好得多。

于 2013-04-12T16:41:33.613 回答