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

Why my Array of JComboBox are not updated?

我创建了一个名为 array:

的字段 Object[]
private Object[] array;

然后我用维度启动它并在方法 A 中添加 JComboBox:

array = new Object[14];
array[0] = combo1;
array[1] = combo2;
....

然后,我在方法B中更改了这些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) 是:

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;
}

最后,我在方法C中再次调用这个数组,却发现所有的JComboBox里面都没有数据。

for (int i=0; i<14; i++ ){
    TableColumn col = table.getColumnModel().getColumn(i);
    col.setCellEditor(new DefaultCellEditor((JComboBox<String>)(array[i])));
    //here I found the data collection in each combo is empty
    col.setCellRenderer(new ComboRenderer());
}

所以,数组在我的例子中是不可变的?或者这些 JComboBox 是不可变的?

updateCombo 中你创建了一个 JComboBox 的新实例,但是数组包含一个 link 到旧实例

您需要明确地将旧实例替换为 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);
}

并且只需在 changeCombo

中调用 replaceComboModel(combo, data) 而不是 combo = updateCombo(data)

我可能会错过一些挥杆内部结构,

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