我创建了一个名为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是不可变的?
答案 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还可以帮助您了解对象引用的性质 - 请参阅传递引用数据类型参数部分。