2010-11-30 2 views
1

変更/通知イベントをトリガーせずにJComboBoxの選択したアイテムのようにUIの要素をプログラム的に変更する必要がある場合は、比較的清潔ですか?スイング:コールバックをトリガーせずにUIをプログラム的に変更する

すべてのリスナーを切り離して、変更したいリスナーを一度修正した後に再接続することはできますが、通常はどのように行うのですか? (ある要素が変更され、それらの変更がコールバックをトリガしてはならないと認められると認められることを考慮して)

P.S:実際にすべてのリスナーを切り離し、変更を実行してから、すべてのリスナーを再接続して動作させる方法で作成しましたが、私にとってはちょっと馬鹿げたようです。

+1

このコメントは、例えば、この**要件**の理由の1つは、巨大なコードベースに対して小さな変更を行う必要があることを強調しています。誰も書いていないし、すべてをきれいに再設計する時間がない。 – SyntaxT3rr0r

答えて

1

私が実装している方法は、あなたが探していることを行うきれいな方法に最も近いものだと思います。そして、私が当然必要とされていることを理解している間は、すべてのセットリスナー(特に自分自身を設定しているものだけでなく、すべて)を避けることによって、あなたの状態を内部的に一貫性のないものへの適用

私は私が言っていることは、あなたが注意して進めるべきであると仮定:)

2

通常、問題はすべてのリスナーが、1ではありません - 私たち自身の1。そのようなイベントを無視するための典型的なパターンは以下の通りです:

private boolean ignoreEvents; 

public void initialize(...) { 
    ignoreEvents = true; 
    try { 
     // set the combobox value 
    } 
    finally { 
     ignoreEvents = false; 
    } 
} 

private void processMyXyEvent(...) { 
    if (ignoreEvents) { 
     return; 
    } 

    // listener code 
} 
+0

+1興味深い...既定のAPIに既に存在するようなものがあったとしたら、「setButDoNotTrigger(...)」などと言います。つまり、あなたが掲示した例では、ignoreEvents * volatileを正しいものにする方が良いと思いますか? – SyntaxT3rr0r

+0

IMHO EDTでのみアクセスする必要があるため、揮発性にする必要はありません。 – Mot

関連する問題