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

        }
    }
4

1 に答える 1

3

MutableComboBoxModel<T>インターフェースを実装するクラスを作成し、のTreeMap<T>またはその他の子をSortedMap<T>データ核として使用します。HashMapJComboBox のモデルは順序付けする必要があり、HashMap は順序付けされていないため、a を使用する必要はないと思います。

AbstractListModel<E>このクラスは、ListModel の機能を自動的に取得するためにも拡張する必要があります。これにより、独自の EventListenerList を維持する必要がなくなり、上記のリストの下位 4 つのメソッドのうち 2 つと、いくつかの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)
  • ListModel<E>およびの 4 つ
    • void addListDataListener(ListDataListener listener)書く必要はありません -- AbstractListModel の一部です
    • E getElementAt(int index)
    • int getSize()
    • void removeListDataListener(ListDataListener listener)書く必要はありません -- AbstractListModel の一部です

これは実行可能であるべきだと私は考えるべきです。

編集:これをもう少し調べてみると、 に問題がありinsertElementAt(...)ます。モデルの核として SortedMap を提唱してきたので、「自然な」順序でソートされているため、マップ内の位置に要素を任意に追加することはできません。これは、モデルのデータ核として ArrayList、Vector、またはその他の同様のコレクションを使用する場合に最適に機能します。

編集 2 : Omid の提案に従って、 LinkedHashMapを使用する方がはるかに優れています。

于 2013-04-12T16:41:33.613 に答える