2016-08-24 2 views
2

создать поле Object[] имени array:Почему мой массив JComboBox не обновлен?

private Object[] array; 

А потом начать ее измерение и добавить JComboBox в него в методе A:

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

Затем я изменил модель данных этих JComboBox в способе B, 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 неизменяемы?

+0

Что такое 'combo1' и' combo2', откуда оно взялось? –

+0

Я просто создаю их в первой части, например: 'JComboBox combo1 = new JComboBox();' и т. Д. – FaithReaper

+0

Где находится аргумент 'combo' в методе' changeCombo'? Как это связано с массивом? –

ответ

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 может также помочь вам понять характер ссылок на объекты - см. Передача рефералов ce Тип данных Аргументы часть.

+0

так, с 'combo = updateCombo (data);' эти комбо не обновляются в массиве? Но вне массива они изменены? Я пропустил некоторые базовые концепции Java здесь? – FaithReaper

+0

@FaithReaper: Да.Это одна из основ Java. Вам нужно понять, что вы работаете с объектными ссылками. Если вы создаете какой-либо новый экземпляр объекта, вы должны где-то сохранить эту ссылку, если вы хотите использовать этот объект в будущем. –

+0

@FaithReaper: речь идет не о неизменности, а о взаимоотношениях между кучей java и стекем. Это описано в самом начале любой java-книги. Здесь вы можете прочитать основы java OOP - https://docs.oracle.com/javase/tutorial/java/javaOO/index.html –

Смежные вопросы