Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JCombox可以共享模型但不能共享选定项状态吗?_Java_Swing_Jcombobox - Fatal编程技术网

Java JCombox可以共享模型但不能共享选定项状态吗?

Java JCombox可以共享模型但不能共享选定项状态吗?,java,swing,jcombobox,Java,Swing,Jcombobox,在我的应用程序中,我有3个组合框,每个组合框包含相同的项目列表,但是每个组合框可以选择不同的项目。还有一个按钮,允许添加新项目,添加时应将其添加到所有三个组合框中,此新添加的项目也应成为组合框3的选定项目,但组合框1和2的选定项目不应更改 我正在尝试决定是否所有三个组合框都应该共享相同的defaultcomboxmodel。这将使新添加的项目很容易出现在每个组合中,但与JList不同的是,没有一个单独的列表选择模型似乎会破坏它 但是,JComboxModel的Javadocs表示: 所选项目不一

在我的应用程序中,我有3个组合框,每个组合框包含相同的项目列表,但是每个组合框可以选择不同的项目。还有一个按钮,允许添加新项目,添加时应将其添加到所有三个组合框中,此新添加的项目也应成为组合框3的选定项目,但组合框1和2的选定项目不应更改

我正在尝试决定是否所有三个组合框都应该共享相同的
defaultcomboxmodel
。这将使新添加的项目很容易出现在每个组合中,但与JList不同的是,没有一个单独的列表选择模型似乎会破坏它

但是,JComboxModel的Javadocs表示:

所选项目不一定由基础项目管理 列表模型。这种不相交的行为允许临时存储和 检索模型中的选定项


这是否意味着我可以对所选项目使用不同的机制,我不清楚上面这句话的意思。

JComoboxModel引入的唯一方法是
getSelectedItem()
setSelectedItem(Object anItem)
,所以我会说不

基本上,您可以将每个模型的数据放在一个单独的共享列表中。然后,您可以创建使用此数据列表的组合框模型的三个新实例(使用您自己的实现或为
defaultcomboxmodel
)设定种子。这些将分别应用于每个组合框,这样每个组合框都有自己的模型

List sharedData = //... Create a list of data...
JComboBox box1 = new JComboBox(new MyComboBoxModel(list));
JComboBox box2 = new JComboBox(new MyComboBoxModel(list));
JComboBox box3 = new JComboBox(new MyComboBoxModel(list));
MyComboxModel

public class MyComboBoxModel extends AbstractListModel implements ComboBoxModel {

    private List data;
    private Object selectedItem;
    public MyComboBoxModel(List dat) {
        this.data = data;
    }

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

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

    @Override
    public void setSelectedItem(Object anItem) {
        selectedItem = anItem;
    }

    @Override
    public Object getSelectedItem() {
        return selectedItem;
    }

}

如果你有一个数组,那么你也可以很容易地使用它。我想你最好的办法是用相同的数据创建三个独立的模型。Thx,如果我有三个独立的模型都是用相同的向量初始化的,然后我想添加一个新的项,我使用什么机制来添加它,通过一个模型,或者直接添加到向量,或者我必须向每个模型添加项才能添加一个新元素,您需要让模型发出模型已更新的通知。有两种方法可以做到这一点。您可以在模型上创建一个方法,该方法允许您触发受保护的方法。这将允许您向
向量添加一个值
,但您需要对每个模型分别调用“update”方法,以便更新视图。或者,您可以进行一些欺骗。您使用
ListModel
作为主要共享容器(实现
DefaultListModel
。然后每个组合框将向该模型附加一个
ListDataListener
)(当您通过构造器传递它时,`并简单地传递更新事件,这将允许组合框充当代理,但现在考虑可能更容易,只需保持组合完全独立,并简单地调用每个组合上的addElement,无论如何都标记为正确,因为您已经提供了一个全面的答案。)