今天做項(xiàng)目,用到了JComboBox,即下拉列表框。為了在被選中的項(xiàng)發(fā)生改變時(shí)獲得被選中的項(xiàng),所以使用的ItemStateChanged事件,可是問(wèn)題就來(lái)了,每次觸發(fā)該事件,它都執(zhí)行兩次,屢試不爽。一開(kāi)始以為是代碼寫錯(cuò)了,可是仔細(xì)檢查確沒(méi)有發(fā)現(xiàn)什么可疑的地方,百思不得其解。于是到網(wǎng)上查找資料,發(fā)現(xiàn)很多朋友都遇到了一樣的情況,于是斷定,并非自己的代碼錯(cuò)誤。便開(kāi)始查資料,翻書,問(wèn)朋友。一番苦功沒(méi)有白下,終于在朋友那里得到了滿意的合理的解答,恍然大悟。
解釋一下原因,其實(shí)很簡(jiǎn)單,從該事件的字面意思來(lái)理解,就是item的狀態(tài)發(fā)生改變時(shí)觸發(fā)該事件,item在這里的狀態(tài)有兩個(gè),Selected 和 deSelected(即選中和未被選中),所以,當(dāng)改變下拉列表中被選中的項(xiàng)的時(shí)候,其實(shí)是觸發(fā)了兩次事件,第一次是上次被選中的項(xiàng)的 State 由 Selected 變?yōu)?deSelected ,即取消選擇, 第二次是本次被選中的項(xiàng)的 State 由 deSelected 變?yōu)?Selected ,即新選中,所以,必然的 ItemStateChanged 事件中的代碼要被執(zhí)行兩次了。
解決方法 就是:
if(e.getStateChange() == ItemEvent.SELECTED){
//要執(zhí)行的代碼
}
即為當(dāng)事件是選中某一項(xiàng)的時(shí)候,才執(zhí)行該代碼。
這一點(diǎn),竊以為不如C#了,人家起碼有個(gè)SelectedIndexChanged事件,可以直接在被選中項(xiàng)發(fā)生改變是觸發(fā),而不會(huì)有以上的歧義~
解釋一下原因,其實(shí)很簡(jiǎn)單,從該事件的字面意思來(lái)理解,就是item的狀態(tài)發(fā)生改變時(shí)觸發(fā)該事件,item在這里的狀態(tài)有兩個(gè),Selected 和 deSelected(即選中和未被選中),所以,當(dāng)改變下拉列表中被選中的項(xiàng)的時(shí)候,其實(shí)是觸發(fā)了兩次事件,第一次是上次被選中的項(xiàng)的 State 由 Selected 變?yōu)?deSelected ,即取消選擇, 第二次是本次被選中的項(xiàng)的 State 由 deSelected 變?yōu)?Selected ,即新選中,所以,必然的 ItemStateChanged 事件中的代碼要被執(zhí)行兩次了。
解決方法 就是:
if(e.getStateChange() == ItemEvent.SELECTED){
//要執(zhí)行的代碼
}
即為當(dāng)事件是選中某一項(xiàng)的時(shí)候,才執(zhí)行該代碼。
這一點(diǎn),竊以為不如C#了,人家起碼有個(gè)SelectedIndexChanged事件,可以直接在被選中項(xiàng)發(fā)生改變是觸發(fā),而不會(huì)有以上的歧義~