1

に問題がありComboBox、複数のComboBoxes に同じモデルを設定しましたが、プログラムを実行して 1 つの 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

のみを使用しListModelてデータを管理し、 にComboboxModel基づくアダプタを作成しますListModel。これComboboxModelは、選択機能を追加するだけです。ComboboxModela extendsを覚えておいてください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);
    }
}

そうすれば、1 つの ListModel でデータを管理するだけで済み、個別の選択モデルが得られます。

The MVC pattern と SWINGも見てください。

于 2013-08-11T13:13:41.487 に答える