1

我的 GUI 中有多个组合框,它们都需要有数据。此数据将随机更改,因此需要一种快速保持所有值同步的方法。我遇到了 DefaultComboBoxModel 它实际上非常适合。唯一的问题是,我需要组合框彼此独立 - 意思是:如果我选择一个值,所有其他值都不应该改变。我做了一些研究并阅读了标准的 java 教程,但没有人真正告诉我如何使用 DefaultComboBoxModel 实现这一点。

这里的这个例子准确地说明了我需要什么:在两个 JComboBoxes 之间共享数据模型 除了 selectedindex 在选择一个时不应该同时改变。

这个问题已经问了一个非常相似的问题,但我不知道如何处理“装饰”。

有什么方法可以防止更改,或者例如只使用普通数组来同步值?

也许有人可以用鱼快速打我的脸,因为解决方案可能真的很简单......

4

1 回答 1

3

我认为这就是罗宾在您在帖子中提到的答案中所解释的。您将原始组合框模型包装成 2 个独立的组合框模型,它们依赖于原始组合框模型作为数据元素,但实现它们自己的选择模型。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class SharedDataBetweenComboBoxSample {

    public static class MyComboBoxModel extends DefaultComboBoxModel implements ComboBoxModel, ListDataListener {
        private DefaultComboBoxModel original;

        public MyComboBoxModel(DefaultComboBoxModel original) {
            super();
            this.original = original;

        }

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

        @Override
        public Object getElementAt(int index) {
            return original.getElementAt(index);
        }

        @Override
        public void addListDataListener(ListDataListener l) {
            if (getListDataListeners().length == 0) {
                original.addListDataListener(this);
            }
            super.addListDataListener(l);
        }

        @Override
        public void removeListDataListener(ListDataListener l) {
            super.removeListDataListener(l);
            if (getListDataListeners().length == 0) {
                original.removeListDataListener(this);
            }
        }

        @Override
        public void addElement(Object anObject) {
            original.addElement(anObject);
        }

        @Override
        public void removeElement(Object anObject) {
            original.removeElement(anObject);
        }

        @Override
        public int getIndexOf(Object anObject) {
            return original.getIndexOf(anObject);
        }

        @Override
        public void insertElementAt(Object anObject, int index) {
            original.insertElementAt(anObject, index);
        }

        @Override
        public void removeAllElements() {
            original.removeAllElements();
        }

        @Override
        public void removeElementAt(int index) {
            original.removeElementAt(index);
        }

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

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

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

    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final String labels[] = { "A", "B", "C", "D", "E", "F", "G" };

                final DefaultComboBoxModel model = new DefaultComboBoxModel(labels);

                JFrame frame = new JFrame("Shared Data");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel panel = new JPanel();
                JComboBox comboBox1 = new JComboBox(new MyComboBoxModel(model));
                comboBox1.setEditable(true);

                JComboBox comboBox2 = new JComboBox(new MyComboBoxModel(model));
                comboBox2.setEditable(true);
                panel.add(comboBox1);
                panel.add(comboBox2);
                frame.add(panel, BorderLayout.NORTH);

                JButton button = new JButton("Add");
                frame.add(button, BorderLayout.SOUTH);
                ActionListener actionListener = new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent actionEvent) {
                        model.addElement("New Added");
                    }
                };
                button.addActionListener(actionListener);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
于 2013-06-03T09:51:45.530 回答