71952


今はSwingから会社が独自にカスタマイズさせてた技術を使って、GUIコンポーネントの画面の実装をしています。

以下のような仕様ですが、結論から言うと、  
**コンボボックスのchangeイベントをキャンセルした後で、コンボボックスを変更してもchangeイベントが発生しなくなります。その問題を解決したいです。**
ただ、もう一度コンボボックスを変更するとchangeイベントが発生します。

仕様としては  
①コンボボックス（モード）を変更したときにデータをリセットするのですが、  
②変更したとき破棄していいかの確認ダイアログを表示して、「キャンセル」なら、データリセットせずにコンボボックスも元に戻します。

一部開示できない部分はありますが、以下のような実装です。

[code]

    private ComboBox getCmbMode() {
        // 略
    
        cmbMode.addValueChangeListener(new valueChangeListener() {
            boolean isCalled = false;
            @Override
            public void valueChange(valueChangeEvent e) {
                if(isCalled) return; 
                try {
                    isCalled = true;
                    // 確認ダイアログを表示し、
                    // キャンセルなら
                    // コンボボックスを変更前の状態にし、リターン
                        getCmbMode().setValue(e.getOldValue());    
                        return;
                    // OKなら
                    // データをリセットする
                    
                } finally {
                    isCalled = false;
                }
            }
        });
    }
    
[/code]

確認ダイアログキャンセルしたときに変更前の値にコンボボックスを戻しているのですが、そのせいで、次にコンボボックスを変更してもchangeイベントが発生していなのかもしれません。しかし、変更後の値をキャンセルされたらもとに戻す必要があるので、その処置は必要です。

**このような状況なのですが、  
コンボボックスを変更し、破棄していいかの確認ダイアログをキャンセルしたときに、コンボボックスの値がもとの値のままになり、なお次に変更したときにchangeイベントが発生するようにしたいです。**

アドバイスいただけると幸いです。


CC BY-SA 4.0
2020-11-07T15:09:33.050
71788
2020-11-14T16:13:18.390
40231
question
java swing
changeイベントをキャンセルした後で、コンボボックスを変更してもchangeイベントが発生しない問題を解決したい


(このコードはSwingでなく[Vaadin](https://vaadin.com/)ではないでしょうか？)

省略されているコードの方に問題があるように見えるので、現在の質問文からは何が起こっているのか分かりません。  
(ですので質問文を見直す必要があるかと考えます。)

`getCmbMode()`の中で`addValueChangeListener`で新しい`ValueChangeListener`を毎回追加しているように見えますが、これは明らかにおかしいです。


CC BY-SA 4.0
2020-11-14T16:13:18.390
71952
2020-11-14T16:13:18.390
2808
71788
answer