2016-08-24 14 views
2

私はarrayという名前Object[]のフィールドを作成:JComboBoxの配列が更新されないのはなぜですか?

private Object[] array; 

をそして私は次元でそれを開始し、方法AにそれにJComboBoxを追加します。

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

その後、私はこれらのデータモデルを変更方法BにおけるJComboBoxchangeComboupdateCombo(data)がある

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

:最後に

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のを見つけるために、方法Cで再びこの配列を呼び出すには、その中にデータを持ちません。

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

+0

「combo1」と「combo2」とは何ですか? –

+0

私はちょうど 'JComboBox combo1 = new JComboBox();'などの最初の部分でそれらを作成します。 – FaithReaper

+0

'changeCombo'メソッドの' combo'引数はどこから来ますか?それは 'array'にどのように接続されていますか? –

答えて

1

あなたはJComboBoxのの新しいインスタンスを作成しますが、配列は、明示的にchangeComboによって返された新しいものに古いインスタンスを交換する必要が古いインスタンス

へのリンクが含まれています。このような
何か:

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

私が思うに、あなたのケースでは、コンボの既存のインスタンスを再利用することをお勧めします - ただ新規の方には、モデルの変更。それ以上 - 既存のモデルを修正する。

たとえば、あなたがupdateComboModelupdateComboを置き換えることができます。

これオラクル、私はいくつかのスイングの内部を見逃すこと

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

combo = updateCombo(data)の代わりにreplaceComboModel(combo, data)を呼び出すtutorialこともできますオブジェクト参照の性質を理解するのに役立ちます - 合格参照ceデータ型引数部分。

+0

だから、 'combo = updateCombo(data);'これらのコンボは配列内で更新されないのですか?しかし、アレイ外では変更されていますか?私はここでJavaのいくつかの基本的な概念を欠いていますか? – FaithReaper

+0

@FaithReaper:はい。これはJavaの基本の1つです。オブジェクト参照で操作することを理解する必要があります。オブジェクトの新しいインスタンスを作成する場合は、このオブジェクトを将来使用する場合は、その参照をどこかに格納する必要があります。 –

+0

@FaithReaper:不変性についてではなく、Javaヒープとスタックの関係についてです。これは、Javaの本の冒頭に記述されています。ここでは、java OOPの基本を読むことができます - https://docs.oracle.com/javase/tutorial/java/javaOO/index.html –

関連する問題