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