ComboBoxModel作为ListModel的包装器

时间:2014-10-16 13:05:45

标签: java swing comboboxmodel

我希望在多个javax.swing.ListModel之间共享javax.swing.ComboBoxModel

使用以下代码,当我从JComboBox中选择一个项目时,在正在运行的程序中,JComboBox始终显示所选的第一个项目。

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

}

我无法弄清楚上述代码出了什么问题。

如何修复代码?

(限制:不应使用或子类DefaultComboBoxModel或使用任何第三方库。)

0 个答案:

没有答案