2011-01-21 13 views
2
、私はいくつかのコンポーネントは、すべてはその後、横断さベクトル、に保存され、各コンポーネントは、ダイアログ

JCheckBoxの」の値がリセット/変更されません

CreateLists(); // initialises the checkbox vector 

for(int i = 0; i < checkBoxes.size() ; i++){ 
    myPanel.add(checkBoxes.elementAt(i)); 
} 
に追加され、それから何かを上書きせずにJCheckBoxのを継承している

これらのチェックボックスのいくつかはすでに選択されています。

私の問題は次のとおりです:ダイアログを開いてチェックボックスをオンまたはオフにすると、ベクトルのチェックボックスの値は変更されません。選択された選択肢と選択されていない選択肢は、未選択のままです。
JPanels getCompoents()を使って新しい値を取得しようとしましたが、これらの値も間違っています。
チェックボックス継承のItemListenerは、変更が行われたことを確認しますが、新しい値を取得しようとするたびに、チェックボックスが初期化されたものとまったく同じです。ここで

は、私は変化を追跡するために使用されるコンソール出力です:

create lists 

print values: 
checkBox1 = true 
checkBox2 = true 
checkBox3 = false 

checkBox2 clicked new value = false 
checkBox3 clicked new value = true 

print values: 
checkBox1 = true 
checkBox2 = true 
checkBox3 = false 
+0

あなたのコードはより役に立ちます –

+0

ボタンをクリックすると、値を印刷しますか?「値を印刷する」と表示されますか?各チェックボックスのisSelected値からプリントアウトするとコードの一部に見えますか? –

+0

ここで何が起きるかは、より詳細な情報では言い難いです。'CreateLists()'で正確に何が起こるのですか(方法は最初に非大文字で綴るべきです) – lweller

答えて

0

ここではいくつかのより多くのコードや情報れる:

CreateListは()、なんとか見ものとウォッチリストを比較して作成しますそれに応じてチェックボックスをオンにし(true =監視など)、新しい初期化ベクトルに追加します。

、私はこれを使用して値を読み取るには:

Component[] components = pnlGesamt.getComponents(); 
for(int i = 0; i < components.length; i++){ 
    if(components[i] instanceof WLElementCheckBox){ 
     WLElementCheckBox cb = (WLElementCheckBox) components[i]; 
     System.out.println(cb.WlElement().Name() + " = " + cb.isSelected()); 
    } 
} 

JCheckBoxのの相続:

private WatchListElement wlElement; 

public WLElementCheckBox (WatchListElement wl, boolean selected) 
{ 
    super(); 
    WlElement(wl); 
    setSelected(selected); 
    setText(wlElement.Name()); 
    addItemListener(new MIL()); 
} 

public WatchListElement WlElement() 
{ 
    return wlElement; 
} 

public void WlElement (WatchListElement wlElement) 
{ 
    this.wlElement = wlElement; 
} 

public class MIL implements ItemListener{ 

    public void itemStateChanged(ItemEvent arg0) { 
     System.out.println("Ckb " + wlElement.Name() +" geklickt Item neu = " + isSelected()); 

    } 
} 
+0

古いJava: 'for(int i = 0; i BoffinbraiN

0

あなたがそれらを照会しているので、あなたのチェックボックスへの変更が表示されていないことを小さな可能性がありますEvent Dispatch Thread(EDT)ではなく、別のスレッド(メインなど)から取得します。スイングはスレッドセーフではありません。チェックボックスをオンにすると、EDTに値が設定されますが、他のスレッドは古い状態がメモリに保存されていて、更新されていないかどうかをチェックしません。したがって、まずチェックボックスの状態を確認するときは、SwingUtilities.invokeAndWait()またはSwingUtilities.invokeLater()を呼び出して、EDTからチェックボックスの状態を確認する必要があります。

これがなぜ発生するのかの詳細については、Javaでのスレッドセーフティを検索してください。

(また、問題を解決するために同期を使用したくない場合や、GUIでデッドロックが発生する可能性があります)。

最後のプロのヒント:新しいJava for-loop構文を使用すると、コードの読み込みと書き込みが容易になる場合もあれば、より効率的な場合もあります。なることができますあなたのコード...

for(int i = 0; i < checkBoxes.size() ; i++){ 
    myPanel.add(checkBoxes.elementAt(i)); 
} 

... ...

for(JCheckBox c : checkBoxes) { 
    myPanel.add(c); 
} 

これは(Collectionを含む)Iterableである配列、何に取り組んでいます。

関連する問題