共享两个组合框的数据源 [英] Share data source for two comboboxes
问题描述
我的GUI中有多个组合框,都需要拥有数据。此数据将随机更改,因此需要一种快速方法来保持所有值同步。我遇到了DefaultComboBoxModel,它实际上非常完美。唯一的问题是,我需要组合框彼此独立 - 这意味着:如果我在一个上选择一个值,其他所有组合都不应该改变。
我做了一些研究并阅读了标准的java教程,但没有人告诉我如何使用DefaultComboBoxModel实现这一点。
I have multiple comboboxes in my GUI which all need to have the data. This data will change at random so a quick way to keep all values synced is needed. I encountered DefaultComboBoxModel which actually fits quite perfect. Only thing is, that I need the comboboxes to be independent of each other - meaning: if I select a value on one, all others shouldn't change. I've done a bit of research and read the standard java tutorials but none tell me really how to achieve this with the DefaultComboBoxModel.
这个例子在这里说明了我的需求:在两个JComboBox之间共享数据模型
除了选择索引时,selectedindex不会同时改变。
This example here exactly illustrates what I need: Sharing the Data Model between two JComboBoxes Except that the selectedindex shouldn't change on both when selecting one.
这个问题已经提到了类似的事情,但我无法弄清楚如何接近装饰。
This Question asked already quite a similar thing, but I couldn't make out how to approach the "decoration".
有什么方法可以阻止更改或者例如只是使用普通数组来同步这些值吗?
Is there someway to prevent the changing or for example just use a normal array to sync the values?
也许有人可以给我一个快速的打击鱼,因为解决方案可能非常简单...
Maybe someone could give me a quick smack in the face with a fish, as the solution probably is really simple...
推荐答案
我认为这就是罗宾在你的帖子中提到的答案中解释的。您将原始组合框模型包装到2个单独的组合框模型中,这些模型依赖于原始组合框模型,但实现了自己的选择模型。
I think this is what Robin explained in the answer you mentionned in your post. You wrap the original combo box model into 2 separate combo box models which rely on the original one for the data elements, but implement their own selection model.
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);
}
});
}
}
这篇关于共享两个组合框的数据源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!