1

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

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

2 回答 2

2

那是因为它们都引用了同一个模型,模型的任何更改都会影响所有其他组合。

没有办法解决这个问题,除非每个组合框都有自己的DefaultComboBoxModel.

private  DefaultComboBoxModel hBoyModel= new DefaultComboBoxModel();
private  DefaultComboBoxModel hGirlModel= new DefaultComboBoxModel();
//....
ComboHBoy.setModel(hBoyModel);
ComboHGirl.setModel(hGrilModel);
//....
于 2013-08-11T12:44:10.563 回答
1

仅使用 aListModel来管理您的数据并创建一个ComboboxModel基于ListModel. 这ComboboxModel只会添加选择功能。请记住,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

于 2013-08-11T13:13:41.487 回答