ComboBoxModel as wrapper for ListModel

144 Views Asked by At

I want a javax.swing.ListModel be shared among multiple javax.swing.ComboBoxModels.

With the following code , when I select an item from the JComboBox,in a running program through the view, the JComboBox always shows the first item as selected.

public class DelegatedComboBoxModel<T> extends AbstractListModel<T> implements
    ComboBoxModel<T> {

  protected ListModel<T> listModel;
  protected Object selectedObject;

  ListDataListener listDataChangeDelegater = new ListDataListener() {

    @Override
    public void intervalRemoved(ListDataEvent e) {
      fireIntervalRemoved(DelegatedComboBoxModel.this, e.getIndex0(),
          e.getIndex1());
    }

    @Override
    public void intervalAdded(ListDataEvent e) {
      fireIntervalAdded(DelegatedComboBoxModel.this, e.getIndex0(),
          e.getIndex1());

    }

    @Override
    public void contentsChanged(ListDataEvent e) {
      fireContentsChanged(DelegatedComboBoxModel.this, e.getIndex0(),
          e.getIndex1());
    }
  };

  public DelegatedComboBoxModel(ListModel<T> listModel) {
    // DefaultComboBoxModel<E>
    this.listModel = listModel;
    if (listModel.getSize() > 0) {
      selectedObject = listModel.getElementAt(0);
    }
    listModel.addListDataListener(listDataChangeDelegater);
  }

  @Override
  public T getElementAt(int index) {
    if (index >= 0 && index < listModel.getSize())
      return listModel.getElementAt(index);
    else
      return null;
  }

  @Override
  public int getSize() {
    return listModel.getSize();
  }

  @Override
  public void setSelectedItem(Object anObject) {
    if ((selectedObject != null && !selectedObject.equals(anObject))
        || selectedObject == null && anObject != null) {
      selectedObject = anObject;
      fireContentsChanged(this, -1, -1);
    }
  }

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

}

I cannot figure out what went wrong with the above code.

How to fix the code ?

(Limitation : Should not use or subclass DefaultComboBoxModel or use any third-party library.)

0

There are 0 best solutions below