使用相同模型填充多个combobox但选择diff

有了ComboBox问题,我已经使用相同的模型填充了多个ComboBox es,但是当我运行我的程序并从一个ComboBox中选择一个值时,它会为其余的选择相同的值。

 ComboHBoy.setModel(defaultComboBoxModel); ComboHGirl.setModel(defaultComboBoxModel); ComboDHBoy.setModel(defaultComboBoxModel); ComboDHGirl.setModel(defaultComboBoxModel); 

那是因为它们都被引用到相同的模型模型的任何更改都将影响所有其他组合。

除了每个combobox都有自己的DefaultComboBoxModel之外,没有办法解决这个问题。

 private DefaultComboBoxModel hBoyModel= new DefaultComboBoxModel(); private DefaultComboBoxModel hGirlModel= new DefaultComboBoxModel(); //.... ComboHBoy.setModel(hBoyModel); ComboHGirl.setModel(hGrilModel); //.... 

仅使用ListModel来管理数据并创建基于ListModelComboboxModel适配器。 这个ComboboxModel只会添加选择function。 请记住, ComboboxModel扩展了ListModel 。 因此很容易适应接口。

唯一棘手的部分是处理更新事件。

例如:

 public class ListAdapterComboboxModel implements ComboBoxModel { private ListModel dataModel; private Object selectedObject; private DataModelListDataListenerAdapter listDataListenerAdapter; public ListAdapterComboboxModel(ListModel ListModel) { dataModel = ListModel; this.listDataListenerAdapter = new DataModelListDataListenerAdapter(); dataModel.addListDataListener(listDataListenerAdapter); } public int getSize() { return dataModel.getSize(); } public Object getElementAt(int index) { return dataModel.getElementAt(index); } public void addListDataListener(ListDataListener l) { listDataListenerAdapter.addListDataListener(l); } public void removeListDataListener(ListDataListener l) { listDataListenerAdapter.removeListDataListener(l); } public void setSelectedItem(Object anObject) { if ((selectedObject != null && !selectedObject.equals(anObject)) || selectedObject == null && anObject != null) { selectedObject = anObject; ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, -1, -1); listDataListenerAdapter.delegateListDataEvent(e); } } public Object getSelectedItem() { return selectedObject; } private class DataModelListDataListenerAdapter implements ListDataListener { protected EventListenerList listenerList = new EventListenerList(); public void removeListDataListener(ListDataListener l) { listenerList.remove(ListDataListener.class, l); } public void addListDataListener(ListDataListener l) { listenerList.add(ListDataListener.class, l); } public void intervalAdded(ListDataEvent e) { delegateListDataEvent(e); } public void intervalRemoved(ListDataEvent e) { checkSelection(e); delegateListDataEvent(e); } public void contentsChanged(ListDataEvent e) { checkSelection(e); delegateListDataEvent(e); } private void checkSelection(ListDataEvent e) { Object selectedItem = getSelectedItem(); ListModel listModel = (ListModel) e.getSource(); int size = listModel.getSize(); boolean selectedItemNoLongerExists = true; for (int i = 0; i < size; i++) { Object elementAt = listModel.getElementAt(i); if (elementAt != null && elementAt.equals(selectedItem)) { selectedItemNoLongerExists = false; break; } } if (selectedItemNoLongerExists) { ListAdapterComboboxModel.this.selectedObject = null; } } protected void delegateListDataEvent(ListDataEvent lde) { ListDataListener[] listeners = listenerList .getListeners(ListDataListener.class); for (ListDataListener listDataListener : listeners) { listDataListener.contentsChanged(lde); } } } } 

然后就这样使用它

 public class ComboboxModelTest extends JFrame{ public static void main(String[] args) { ComboboxModelTest comboboxModelTest = new ComboboxModelTest(); comboboxModelTest.pack(); comboboxModelTest.setVisible(true); } public ComboboxModelTest() { Container contentPane = getContentPane(); contentPane.setLayout(new FlowLayout()); DefaultListModel defaultListModel = new DefaultListModel(); defaultListModel.addElement("Element 1"); defaultListModel.addElement("Element 2"); ComboBoxModel firstComboboxModel = new ListAdapterComboboxModel(defaultListModel); ComboBoxModel secondComboboxModel = new ListAdapterComboboxModel(defaultListModel); JComboBox jComboBox1 = new JComboBox(firstComboboxModel); JComboBox jComboBox2 = new JComboBox(secondComboboxModel); contentPane.add(jComboBox1); contentPane.add(jComboBox2); } } 

然后,您只需在一个ListModel中管理数据,并且您具有不同的选择模型。

另请参阅MVC模式和SWING 。