我使用的是GEF0.10(http://gef.tigris.org),在某一個Fig上點(diǎn)擊鼠標(biāo)右鍵彈出PopupMenu時,發(fā)現(xiàn)有閃爍的現(xiàn)象,經(jīng)過追查發(fā)現(xiàn),一個鼠標(biāo)右擊動作會分別觸發(fā)Editor.mousePressed(e)、mouseReleased(e)、mouseClicked(e)三個事件,這些事件最終都要流經(jīng)ModeManager,而ModeManager采取的是廣播的方式分發(fā)這些事件,把這些事件依次轉(zhuǎn)發(fā)給mode對列中的所有Mode。ModePopup是默認(rèn)的一個Mode之一,負(fù)責(zé)提供Fig的彈出菜單功能。而ModePopup中的這三個事件都作了如下的判斷:
public void mouseClicked(MouseEvent me) {
boolean popUpDisplayed = false;
if(me.isPopupTrigger() || me.getModifiers() == InputEvent.BUTTON3_MASK) {
popUpDisplayed = showPopup(me);
if (LOG.isDebugEnabled()) {
if (popUpDisplayed) LOG.debug("MousePressed detected as a popup and popup displayed and event consumed");
else LOG.debug("MousePressed detected as a popup but no popup to display");
}
return;
}
LOG.debug("MousePressed is not a popup trigger");
}
其中加紅的這段不知道為什么要作me.getModifiers() == InputEvent.BUTTON3_MASK的判斷,加上這個判斷后只要是鼠標(biāo)右擊動作,ModePopup的mousePressed、mouseReleased和mouseClicked事件中showPopup的代碼都要被執(zhí)行,這樣在一個鼠標(biāo)右擊動作中實(shí)際上彈出了三次PopupMenu,因此造成了閃爍。解決辦法是extend默認(rèn)的ModePopup,覆蓋這三個方法,將判斷改成if ( me.isPopupTrigger())即可。