为什么我的JComboBox数组没有更新?

时间:2016-08-24 08:30:10

标签: java arrays immutability

我创建了一个名为Object[]的{​​{1}}字段:

array

然后我用尺寸启动它并在方法A中添加private Object[] array;

JComboBox

然后,我在方法B array = new Object[14]; array[0] = combo1; array[1] = combo2; .... 中更改了这些JComboBox的数据模型。

changeCombo

private JComboBox<String> changeCombo(String newOption, JComboBox<String> combo, Set<String> data) { if (combo != null) { int size = combo.getModel().getSize(); data.add(newOption); if (size != data.size()){ combo = updateCombo(data); } return combo; } } 的位置:

updateCombo(data)

最后,我在方法C中再次调用此数组,但发现所有JComboBox都没有数据。

private JComboBox<String> updateCombo(Set<String> dataSet) {
    JComboBox<String> combo = new JComboBox<String>();
    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
    model.insertElementAt(Constantes.COMBO_TEXT_TODOS, 0);
    for (String s: dataSet) {
        model.addElement(s);
    }
    combo.setModel(model);
    combo.setSelectedIndex(0);
    combo.addItemListener(new ComboItemListener());
    return combo;
}

那么,在我的情况下,数组是不可变的吗?或者这些JComboBox是不可变的?

1 个答案:

答案 0 :(得分:1)

updateCombo 中,您创建了一个新的JComboBox实例,但该数组包含指向旧实例的链接

您需要明确地将旧实例替换为 changeCombo 返回的较新实例 像这样:

array[i] = changeCombo(newOption, array[i], data);

我认为,在您的情况下,最好重用现有的组合实例 - 只需将其模型更改为较新的模型即可。或者更多 - 修改现有模型。

例如,您可以将updateCombo替换为updateComboModel

private void replaceComboModel(JComboBox<String> combo, Set<String> dataSet) {
    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
    model.insertElementAt(Constantes.COMBO_TEXT_TODOS, 0);
    for (String s: dataSet) {
        model.addElement(s);
    }
    combo.setModel(model);
}

只需在replaceComboModel(combo, data)

内拨打combo = updateCombo(data)而不是changeCombo

我可能会错过一些摇摆内部,

此Oracle tutorial还可以帮助您了解对象引用的性质 - 请参阅传递引用数据类型参数部分。